当我问他是什么时
,这个问题的作者只是取笑我sizeof * q
......他告诉我这是一个非常基本的 C 问题,我应该检查一下。但是当我环顾四周并且以前没有看到有人问过时,我现在自己做:
sizeof
在没有括号和/或类型的情况下使用 C 时会做什么?
因此,如果我们查看C99 草案标准部分一元运算符第1sizeof
段中的语法,如下所示:6.5.3
sizeof unary-expression
sizeof ( type-name )
有一个区别,你不能使用没有括号和部分的类型名称6.5.3.4
sizeof 运算符第2段说(强调我的):
sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。 [...]
为了完整起见,您可能想知道如果sizeof
我们有括号,我们是否可以与表达式一起使用,答案是肯定的,因为一元表达式本身可以包含括号。看到这一点的最简单方法是查看标准草案中的“A.2.1
表达式”部分并像这样处理语法:
unary-expression -> postfix-expression -> primary-expression -> ( expression )
sizeof
是一个运算符,而不是一个函数,所以你不需要()
if 操作数是一个表达式(但你通常使用它们)。sizeof * q == sizeof(*q)
. 请注意,如果操作数是类型,则需要使用()
, 所以sizeof(int)
(参见例如http://en.wikibooks.org/wiki/C_Programming/Reference_Tables)
sizeof sizeof operator for expressions sizeof 123
sizeof() sizeof operator for types sizeof (int)
现在,即使是wiki也充满了关于 C 的信息……世界正在快速变化 :-)
sizeof 运算符用于确定指定数据类型在内存中占用的空间量。要使用 sizeof,关键字“sizeof”后跟一个类型名称或一个表达式(可能只是一个变量名称)。如果使用类型名称,则必须始终将其括在括号中,而表达式可以使用或不使用括号来指定。
sizeof
是一个运算符,特别是一元运算符,如一元&
或++
。它采用一元表达式或用括号括起来的类型名称作为其操作数。
语法是
sizeof一元表达式 sizeof (类型名)
所以,给定一个像这样的声明
int *q;
表达式sizeof *q
和sizeof (int)
是等价的,就像sizeof q
和一样sizeof (int *)
。
与带括号的 sizeof 相同。它是一个右侧一元运算符,因此它将其正确的大小视为操作数。
据我所知,在将 sizeof 与基本数据类型一起使用时,括号是强制性的。
当你有一个变量时int a
,你可以通过两种方式检查它的大小,括号不是强制性的:sizeof a
,sizeof (a)
将同样工作。
但是当检查 int 本身的大小时,它只会sizeof (int)
起作用。
与 parens 做的事情相同 - 它返回您传递的任何内容的大小,在这种情况下,是 . 指向的任何内容的大小q
。
不过,这有点不太清楚,尤其是当我们涉及对 and 的复杂调用时malloc
,sizeof
因此我认为始终使用括号是最佳实践。