【问题标题】: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) 周围加上括号,那么我会得到我期望的输出。

是否存在我误解的操作顺序?

【问题讨论】:

标签: c++ operator-precedence conditional-operator ternary


【解决方案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);
    

    【讨论】:

    • 既然你这样写,对我来说应该很明显了。三元运算符中的第一个操作数是一个条件语句,因此它包含了它之前的所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2016-03-10
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多