在条件中使用三元运算符会产生意外的输出
Posted
技术标签:
【中文标题】在条件中使用三元运算符会产生意外的输出【英文标题】:Using ternary operator inside a condtional gives unexpected output 【发布时间】:2020-05-21 17:29:45 【问题描述】:我试图了解三元运算正在做什么来给我这个输出。我希望条件会在 true == false 评估为 false 但 return_value 的结果在此代码中为 true 时短路。
#include <iostream>
int main()
bool return_value = true == false &&
true == false &&
false ? (true == false) : true; // add parens to see expected output (false ? (true == false) : true);
std::cout << std::boolalpha << return_value << std::endl;
// expected output: false
// actual output : true
如果我在最后一个条件 (false ? (true == false) : true) 周围加上括号,那么我会得到我期望的输出。
是否存在我误解的操作顺序?
【问题讨论】:
en.cppreference.com/w/cpp/language/operator_precedence 三元运算符具有最低优先级之一。 (低于==
和&&
,这解释了这里的行为。)
【参考方案1】:
声明的初始化
bool return_value = true == false &&
true == false &&
false ? (true == false) : true;
可以等效地改写为
bool return_value = ( true == false && true == false && false ) ? (true == false)
: true;
由于逻辑表达式的结果为 false,则返回第三个 (assignmeny-expression),即 true
。
根据 C++ 语法,条件运算符的定义如下
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
还有这个表达
true == false && true == false && false
是一个逻辑或表达式,反过来又在 C++ 语法中定义,如
logical-or-expression:
logical-and-expression
logical-or-expression || logical-and-expression
【讨论】:
【参考方案2】:似乎隐含的操作顺序是
bool return_value = (true == false && true == false && false)
? (true == false)
: true;
而不是
bool return_value = true == false &&
true == false &&
(false ? (true == false) : true);
【讨论】:
既然你这样写,对我来说应该很明显了。三元运算符中的第一个操作数是一个条件语句,因此它包含了它之前的所有内容。以上是关于在条件中使用三元运算符会产生意外的输出的主要内容,如果未能解决你的问题,请参考以下文章