sizeof没有()做什么?

当我问他什么sizeof * q时, 这个问题的作者对我很开心……他告诉我这是一个非常基本的C问题,我应该检查一下。 但是当我环顾四周并且之前没有见过有人询问时,我现在就自己做了:

如果在没有括号和/或类型的情况下使用它,C中的sizeof做什么?

因此,如果我们在C99标准草案第6.5.3节中查看sizeof的语法,则一元运算符1段如下:

 sizeof unary-expression sizeof ( type-name ) 

不同的是你不能使用没有括号的类型名称 ,第6.5.3.4sizeof运算符2段说( 强调我的 ):

sizeof运算符产生其操作数的大小(以字节为单位),可以是表达式或类型的带括号的名称 。[…]

为了完整起见,您可能想知道如果我们有括号并且答案是肯定的,我们是否可以将sizeof与表达式一起使用,因为一元表达式本身可以包含括号。 最简单的方法是查看标准草案中的A.2.1 表达式 ,并通过语法完成:

 unary-expression -> postfix-expression -> primary-expression -> ( expression ) 

sizeof是一个运算符,而不是一个函数,因此如果操作数是一个表达式(但通常使用它们),则不需要() )。 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) 

现在连维基都充满了关于C的信息……世界变化很快:-)

sizeof运算符用于确定指定数据类型在内存中占用的空间量。 要使用sizeof,关键字“sizeof”后跟类型名称或表达式(可能只是变量名称)。 如果使用类型名称,则必须始终将其括在括号中,而可以使用括号或不使用括号指定表达式。

sizeof是一个运算符 ,特别是像一元&++这样的一元运算符。 它采用一元表达式或由parens包围的类型名称作为其操作数。

语法是

   sizeof unary-expression 
   sizeof( 类型名称

所以,给出一个像这样的声明

 int *q; 

表达式sizeof *qsizeof (int)是等价的, sizeof qsizeof (int *)

与parofheses的sizeof相同。 它是一个右侧的一元运算符,因此它将其正确的大小视为操作数。
据我所知,当使用sizeof和基本数据类型时,必须使用paranthesis。

如果你有一个变量int a你可以双向检查它的大小,parantheses不是必需的: sizeof asizeof (a)将工作相同。
但是当检查int本身的大小时,只有sizeof (int)有效。

它与parens一样 – 它返回你传递它的大小,在这种情况下是q所指向的大小。

但是,它有点不太清楚,特别是当我们涉及对mallocsizeof复杂调用时,所以我认为最好总是使用parens。