在C++中,括号运算符自己是什么意思?

4

在编写代码时,我有一个拼写错误导致了意外的编译结果,这迫使我进行测试,并检查编译器(VS 2010)能接受什么。

我写了一个由括号运算符和其中的数字组成的表达式(空括号会导致编译错误):

(444);

当我在调试模式下运行代码时,程序似乎会跳过该行。当圆括号运算符单独出现时,它的含义是什么?

(1+2)*3;的功能完全相同。 - Passer By
有一件事情,我认为可能与此相关,但没有人提到过,那就是括号是不必要的;444;是等效的。它计算值444并对其不做任何处理,或者(由于计算444只是浪费时间且没有任何作用),编译器可以跳过它而不执行任何操作。 - Daniel H
在decltype内部,括号运算符可能会产生影响:因为它始终等同于内部表达式,所以避免了特殊的decltype行为。 - Oliv
2个回答

7
如果我可以随意回答的话,
(444);

是一种语句。可以在语言允许编写语句的任何地方编写,例如在函数中。它由一个表达式444组成,括在括号中(也是一个表达式),后面跟着语句终止符;

当然,在遵循as-if规则的任何合理编译器中,在编译期间都将删除它。

至少需要一个语句的地方是在switch块中(即使程序控制永远不会到达该点):

switch (1){
case 0:
    ; // Removing this statement causes a compilation error
}

2
“informally” 是不是要讽刺一下? ;) - StoryTeller - Unslander Monica
1
@StoryTeller:我太老了(或者太像个江湖骗子了,你来决定……)无法轻易地使用标准语法元素。 - Bathsheba
1
我认为您用正式术语进行了精彩的解释,这让我感到惊奇 :) - StoryTeller - Unslander Monica
有一件事情需要注意,即 decltype(var)decltype((var)) 不会返回相同的类型。有时仅使用圆括号就可以将名称转换为表达式。 - papagaga

0
  • (444);是一个由括号表达式(444)和语句终止符;组成的语句。

  • (444)由括号()prvalue表达式444组成。

括号表达式 (E) 是一个主表达式,其类型、值和值类别与 E 相同。括号表达式可在与 E 可用相同的上下文中使用,并具有相同的含义,除非另有说明。

因此,在这种特殊情况下,括号没有额外的意义, 所以 (444);变成了444;然后被编译器优化掉。


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