调试后我发现三元运算符?:
没有优先级.我的问题是为什么?
我有以下代码:
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
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)
三元运算符的低优先级实现了这一目标.这种事情是您在语言中找到的运算符优先级的全部原因.目标是方便编写预期在语言中正常的表达式.对?如果没有,它可以用括号左右.这对使用起来很烦人,你很快就会提出一些方便的运算符优先级.
确实,?:
运营商没有明确的优先权.但是这个例子并没有真正说明这一点.相对优先级<<
和?:
相当明确.您的所有示例都显示优先级<<
高于优先级?:
.
至于?:
运算?:
符优先级这个更普遍的问题... 与其他运算符相比,运算符具有相对复杂的格式:它有三个非均匀操作数.由于这种不均匀性,之前的部分?
具有与之后的部分不同的句法分组属性?
.
毕竟,"优先级"是为了简化语法定义的句法分组的可视化和记忆而发明的衍生技巧.但并非所有C++运算符都符合该技巧.?:
操作员恰好是那个没有的操作员,这就是为什么正确编写的优先级表通常会为?:
操作员提供附注,解释其不寻常的属性.同样,之前的部分?
具有与之后的部分不同的优先级?
,这就是为什么不可能将?:
操作符正确地放置到优先级的线性表中的原因.
除非我忘记某些事情,否则?:
运营商是唯一没有直接确定优先权的运营商.
PS中?:
运算符的东西在C语言中更糟糕.C++与语法的相关变化使得?:
更好地符合线性优先级的概念.