在条件中使用三元运算符会产生意外的输出

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 三元运算符具有最低优先级之一。 (低于==&amp;&amp;,这解释了这里的行为。) 【参考方案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);

【讨论】:

既然你这样写,对我来说应该很明显了。三元运算符中的第一个操作数是一个条件语句,因此它包含了它之前的所有内容。

以上是关于在条件中使用三元运算符会产生意外的输出的主要内容,如果未能解决你的问题,请参考以下文章

C 三元运算符的意外结果

三元条件下的多个 OR 运算符,

三元运算符

javascript:使用三元运算符的意外评估行为

为啥带赋值的三元运算符不返回预期的输出?

Perl 三元条件运算符中的赋值问题