【问题标题】:When should we use sizeof with and without parentheses [duplicate]我们什么时候应该使用带括号和不带括号的 sizeof [重复]
【发布时间】:2015-01-21 19:19:36
【问题描述】:
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

大小为:36

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

【问题讨论】:

标签: c++ c


【解决方案1】:

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

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

【讨论】:

  • 我就是这么想的,谢谢你解决了我的疑问。
  • Nit:根据表达式,您可能仍然需要括号。 sizeof a + b 并不意味着 sizeof (a + b)。 (我知道你也是这个意思。)
  • 更糟糕的情况是char x[10]; sizeof(x + 1) 将与sizeof x + 1 大不相同。
  • @hvd:同样重要的是要注意sizeof operand 周围可能需要括号。考虑char a; int x = sizeof(a)["abcdef"]; x 是什么?你知道这是否相当于 sizeof (a["abcdef"])(sizeof a)["abcdef"] ?对于假设 () 是 sizeof 语法的一部分的人来说,这非常令人困惑。
  • @BenVoigt hacks 说了什么,而且,“一元运算符组从右到左的表达式”不是我说过的,我不确定你在引用什么. C 语法很明确,sizeof 的表达式操作数必须是 unary-expression,而不是 cast-expression
【解决方案2】:

[expr.sizeof]/1:

操作数是一个表达式,它是一个未计算的操作数 (第 5 条),或带括号的type-id

因此,仅类型需要括号。如果您更喜欢使用括号来保持清晰度和一致性(就像我一样),但您始终可以使用它们,因为 表达式 周围的括号形成另一个 表达式
sizeof 的运算符优先级不是很清楚,可能会引起不适。

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

【讨论】:

  • 引起不适......像什么?
  • @Meninx sizeof 1*2 的值是多少?直观吗?
  • @Columbo;您引用的标准是什么?
  • @hacks N3337 (C++11),但自 C++98 以来,引用应该保持不变
  • @Meninx 没错。谁会期望sizeof 1*2 的大小是int 的两倍?这不是很明显,IMO。
猜你喜欢
  • 1970-01-01
  • 2018-10-13
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2020-04-17
相关资源
最近更新 更多