Использование тернарного оператора внутри условия дает неожиданный вывод - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь понять, что делает троичная операция, чтобы дать мне этот вывод. Я ожидаю, что условное короткое замыкание произойдет, как только 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) , то получу ожидаемый вывод.

Есть ли порядок операций, который я неправильно истолковал?

Ответы [ 2 ]

4 голосов
/ 05 февраля 2020

Похоже, что неявный порядок операций равен

bool return_value = (true == false && true == false && false)
                  ? (true == false)
                  : true;

Вместо

bool return_value = true == false &&
                    true == false &&
                    (false ? (true == false) : true);
1 голос
/ 05 февраля 2020

Инициализация объявления

bool return_value = true == false &&
                    true == false &&
                    false ? (true == false) : true;

может быть эквивалентно переписана, как

bool return_value = ( true == false && true == false && false ) ? (true == false) 
                                                                : true;

. В результате логическое выражение оценивается как ложное, а третье (assignmeny-выражение) равно возвращено 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
...