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

cmi*_*idi 16 c c++

typedef struct rem{
    int  addr;
    char addrbuf[32];
} foo;
Run Code Online (Sandbox Code Playgroud)

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

foo addr;
printf("size is: %d\n",sizeof addr);
printf("size is: %d\n",sizeof (foo));
Run Code Online (Sandbox Code Playgroud)

大小是:36

大小是:36

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

Rei*_*ica 24

当使用sizeof一个类型,你需要周围的括号类型.将它与表达式一起使用时,则不会.但是你也可以在这种情况下包括它们,在这种情况下你不必担心运算符优先级.对于像这样的不常见的运营商,更少的人会确定优先级,因此清晰度肯定有帮助.

所以我会说最好总是使用它们.

  • Nit:根据表达式,你可能仍然需要括号.`sizeof a + b`并不意味着`sizeof(a + b)`.(我知道那也是你的意思.) (7认同)
  • 更糟糕的情况是`char x [10]; sizeof(x + 1)`与`sizeof x + 1`非常不同. (4认同)
  • @hvd:同样重要的是要注意`sizeof operand`周围可能需要括号.考虑一下`char a; int x = sizeof(a)["abcdef"];`什么是`x`?你知道这是否相当于`sizeof(a ["abcdef"])`或`(sizeof a)["abcdef"]`?假设`()`的人是sizeof语法的一部分非常困惑. (2认同)

Col*_*mbo 10

[expr.sizeof]/1:

操作数是一个表达式,它是一个未评估的操作数(第5章),或带括号的type-id.

因此,括号仅适用于类型.如果你喜欢使用的透明度和一致性括号(像我一样),你可以随时虽然使用它们,围绕一个括号表达形成另一种表达.
运算符优先级sizeof不是很清楚,可能会引起烦恼.

此外,对于sizeof...操作员,您始终必须使用括号(一致性的另一个原因).

  • @Meninx`sizeof 1*2`的价值是多少?它直观吗? (2认同)