sizeof没有()做什么?

时间:2013-09-19 15:21:59

标签: c sizeof

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

C中的sizeof在没有括号和/或类型的情况下使用了什么?

5 个答案:

答案 0 :(得分:21)

因此,如果我们在C99 draft standard部分sizeof 一元运算符 1 中查看6.5.3的语法,那么它就是如下:

sizeof unary-expression
sizeof ( type-name )

如果没有括号,您不能使用类型名称并且6.5.3.4 部分<运营商段落 2 说(强调我的):

  

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

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

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

答案 1 :(得分:19)

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)

现在即使wiki充满了关于C的信息......世界正在快速变化: - )

  

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

答案 2 :(得分:7)

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

语法是

  sizeof unary-expression 
  sizeof ( type-name )

所以,给出像

这样的声明
int *q;

表达式sizeof *qsizeof (int)是等效的,sizeof qsizeof (int *)也是如此。

答案 3 :(得分:3)

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

当您拥有变量int a时,您可以双向检查其大小,但不必强制执行:sizeof asizeof (a)的工作方式相同。
但是当检查int本身的大小时,只有sizeof (int)才有效。

答案 4 :(得分:3)

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

虽然这有点不太清楚,尤其是当我们参与到mallocsizeof的复杂调用时,所以我认为最好始终使用parens。