何时应该在sizeof前加上括号?

33
typedef struct rem{
    int  addr;
    char addrbuf[32];
} foo;

这两个代码返回相同的结果

foo addr;
printf("size is: %d\n",sizeof addr);
printf("size is: %d\n",sizeof (foo));

尺寸是:36

但我们什么时候应该使用带括号和不带括号的sizeof


关于编程的内容:sizeof不带括号做什么? - Shafik Yaghmour
2个回答

49

当使用sizeof与一个类型一起使用时,需要在类型周围加上括号。当将其与表达式一起使用时,则不需要。但是,在这种情况下,您当然也可以包括它们,并且您不必担心运算符优先级。对于这种不常见的运算符,较少的人会确定优先级,因此清晰度肯定有所帮助。

所以我认为最好始终使用它们。


这正是我所想的,谢谢你消除了我的疑虑。 - cmidi
11
注意:根据表达式的情况,即使在那种情况下你可能仍然需要括号。sizeof a + b 并不意味着 sizeof (a + b)。(我知道这也是你的本意。) - user743382
5
更糟糕的情况是 char x[10]; sizeof(x + 1) 的结果将与 sizeof x + 1 很不相同。 - Iharob Al Asimi
4
需要注意的是,在 sizeof 操作数周围可能需要加上括号。例如,考虑代码 char a; int x = sizeof(a)["abcdef"];,那么 x 等于多少呢?你是否知道这与 sizeof (a["abcdef"]) 或者 (sizeof a)["abcdef"] 等价?这对于那些认为 ()sizeof 语法的一部分的人来说非常令人困惑。 - Ben Voigt
1
@BenVoigt,我同意haccks的说法,但是,“一元运算符表达式从右向左分组”不是我说的话,我也不确定你引用的是什么。C语法明确规定sizeof的表达式操作数必须是一个一元表达式,而不是一个强制转换表达式 - user743382
显示剩余12条评论

15

[expr.sizeof]/1:

操作数可以是一个未求值的表达式(第5节),或者是一个带括号的类型标识符

因此,括号仅适用于类型。如果您喜欢为清晰和一致性而使用括号(就像我一样),您总是可以使用它们,因为将表达式放在括号中会形成另一个表达式
sizeof运算符的优先级并不是很知名,可能会引起烦恼。

另外,对于sizeof...运算符,您始终需要使用括号(另一个保持一致性的原因)。


引起烦恼的原因是什么?比如什么? - Meninx - メネンックス
2
@Meninx sizeof 1*2的值是多少?它直观吗? - Columbo
@Columbo,你引用的是哪个标准? - haccks
@Columbo:这个值取决于机器!但我可以说它与sizeof(int) * 2相同。 - Meninx - メネンックス
1
@Meninx 没错。谁会期望 sizeof 1*2 的大小是 int 的两倍?在我看来,这并不是很明显。 - Columbo
显示剩余2条评论

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