为什么运算符`?:`没有优先权?

Que*_*est 24 c++

调试后我发现三元运算符?:没有优先级.我的问题是为什么?
我有以下代码:

bool T = true;
cout << ((T == true) ? "true" : "false") << endl;
cout << (T == true) ? "true" : "false";
Run Code Online (Sandbox Code Playgroud)

输出:

true
1
Run Code Online (Sandbox Code Playgroud)

现场演示:http://ideone.com/Tkvt9q

Mik*_*our 35

条件运算符确实具有优先权(尽管其三元性质略微复杂); 但这个优先级非常低.因为它低于<<,所以第二个被解析为

(cout << (T == true)) ? "true" : "false";
Run Code Online (Sandbox Code Playgroud)

流式传输布尔值T == true,然后评估(但忽略)表达式"true".如果您启用一组合理的警告,大多数编译器都会发出警告.

以下是对运算符优先级的引用,显示优先级<<高于(7)而不是?:(15):http://en.cppreference.com/w/cpp/language/operator_precedence


das*_*ght 29

条件运算符? :确实具有优先级 - 在此表中它的数字是15 ,低于<<>>运算符,它们是数字7.

我遵循以避免这样的错误的规则是在有疑问时使用括号.理由很简单:如果你需要在表格中查找优先级,很可能你的代码的读者,包括你自己,需要在以后做同样的事情.

  • 只为该规则+1.太多的程序员省略了编译器不必要的parantheses,但对人类读者很有用. (7认同)
  • @AndyThomas当然有平衡.太多的parens,你也可以写LISP (4认同)

Bri*_* C. 11

很多其他问题都回答了为什么你会看到这种行为,但他们没有回答为什么三元运算符的优先级低.

由于我们不想要代码,因此决定具有较低的三元优先级

a<d ? 10 : 100
Run Code Online (Sandbox Code Playgroud)

结束意义

a < (d ? 10 : 100) //BAD: not what we normally expect
Run Code Online (Sandbox Code Playgroud)

我们想要它的意思

(a<d) ? 10 : 100 
Run Code Online (Sandbox Code Playgroud)

三元运算符的低优先级实现了这一目标.这种事情是您在语言中找到的运算符优先级的全部原因.目标是方便编写预期在语言中正常的表达式.对?如果没有,它可以用括号左右.这对使用起来很烦人,你很快就会提出一些方便的运算符优先级.


AnT*_*AnT 7

确实,?:运营商没有明确的优先权.但是这个例子并没有真正说明这一点.相对优先级<<?:相当明确.您的所有示例都显示优先级<<高于优先级?:.

至于?:运算?:符优先级这个更普遍的问题... 与其他运算符相比,运算符具有相对复杂的格式:它有三个非均匀操作数.由于这种不均匀性,之前的部分?具有与之后的部分不同的句法分组属性?.

毕竟,"优先级"是为了简化语法定义的句法分组的可视化和记忆而发明的衍生技巧.但并非所有C++运算符都符合该技巧.?:操作员恰好是那个没有的操作员,这就是为什么正确编写的优先级表通常会为?:操作员提供附注,解释其不寻常的属性.同样,之前的部分?具有与之后的部分不同的优先级?,这就是为什么不可能将?:操作符正确地放置到优先级的线性表中的原因.

除非我忘记某些事情,否则?:运营商是唯一没有直接确定优先权的运营商.

PS中?:运算符的东西在C语言中更糟糕.C++与语法的相关变化使得?:更好地符合线性优先级的概念.

  • @bdesham:经典引用的例子是`a?b = c:d = e`.在C中它被解析为`(a?(b = c):d)= e`,而在C++中它是`a?(b = c):( d = e)`.(参见Mike Seymour回答中链接页面的"注释"部分) (3认同)