sizeof * q
是什么意思时嘲笑了我...
他告诉我这是一个非常基本的C问题,让我自己去查阅资料。
但是我在 StackOverflow 上搜寻了一下,并没有看到有人之前问过这个问题,因此现在我来问:
如果在 C 中使用 sizeof
而未加括号和类型,它会做什么?
因此,如果我们查看C99草案标准中第6.5.3
节 一元运算符的第1段中sizeof
的语法如下:
sizeof unary-expression
sizeof ( type-name )
有一个差别,你不能在没有括号的情况下使用type-name,第6.5.3.4
节The sizeof operator的第2段说(我的强调):
sizeof
操作符返回其操作数(表达式或类型的加括号名称)的大小(以字节为单位)。[...]
为了完整起见,您可能想知道如果我们有括号是否可以使用一个表达式来使用sizeof
,答案是肯定的,因为一元表达式本身就可以包含括号。最简单的方法是查看草案标准中的A.2.1
节Expressions并按以下方式处理语法:
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
是一个操作符,具体来说是像单目运算符 &
或 ++
那样的单目运算符。它以括号括起来的类型名称或一元表达式作为其操作数。
语法如下:
sizeof unary-expression sizeof ( type-name )
因此,考虑以下声明:
int *q;
sizeof *q
和 sizeof (int)
是等价的,sizeof q
和 sizeof (int *)
也是等价的。int a
时,可以通过两种方式检查其大小,括号不是必需的:sizeof a
,sizeof (a)
将起到相同的作用。sizeof (int)
有效。对于括号,它所做的事情也是返回你传递给它的任何东西的大小,例如在这种情况下,指向q
的任何内容的大小。
然而,当我们涉及到对malloc
和sizeof
进行复杂调用时,情况就不太清晰了,因此我认为最好的做法是始终使用括号。