sizeof不带括号的作用是什么?

14
此问题的作者在我问他sizeof * q是什么意思时嘲笑了我... 他告诉我这是一个非常基本的C问题,让我自己去查阅资料。 但是我在 StackOverflow 上搜寻了一下,并没有看到有人之前问过这个问题,因此现在我来问:

如果在 C 中使用 sizeof 而未加括号和类型,它会做什么?


3
我可能错了,但我认为sizeof(expr)与sizeof expr是相同的。如果我错了,毫无疑问会有人纠正我! - Charlie Burns
为什么sizeof被认为是一个运算符? - P.P
5个回答

25

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

sizeof unary-expression
sizeof ( type-name )

有一个差别,你不能在没有括号的情况下使用type-name,第6.5.3.4The sizeof operator的第2段说(我的强调):

sizeof操作符返回其操作数(表达式或类型的加括号名称)的大小(以字节为单位)。[...]

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

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

23

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" 后面跟一个类型名或表达式(可能仅是变量名)。如果使用类型名,则必须始终将其括在括号中,而表达式可以带括号也可以不带。


9

sizeof 是一个操作符,具体来说是像单目运算符 &++ 那样的单目运算符。它以括号括起来的类型名称或一元表达式作为其操作数。

语法如下:

  sizeof unary-expression 
  sizeof ( type-name )

因此,考虑以下声明:

int *q;

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

4
与sizeof相同,只是加了括号。它是一个右侧一元运算符,因此将其右侧视为操作数。
据我所知,使用基本数据类型时,必须使用括号。
当您有一个变量int a时,可以通过两种方式检查其大小,括号不是必需的:sizeof asizeof (a)将起到相同的作用。
但是,仅检查int本身的大小时,只有sizeof (int)有效。

3

对于括号,它所做的事情也是返回你传递给它的任何东西的大小,例如在这种情况下,指向q的任何内容的大小。

然而,当我们涉及到对mallocsizeof进行复杂调用时,情况就不太清晰了,因此我认为最好的做法是始终使用括号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接