Условный оператор странный вывод - PullRequest
3 голосов
/ 08 июля 2019

Раньше я считал, что использование условного оператора в приведенном ниже утверждении - это нормально, но это не так. Есть ли какое-либо ограничение на использование условного оператора в сложном утверждении?

#include <iostream>
using namespace std;

int main() {
    int a = 1;
    int b = 10;
    bool c = false;

    int result = a * b + b + c ? b : a;

    std::cout << result << std::endl;

    return 0;
}

Прогнозируемый выход: 21

Фактический объем производства: 10

Почему?

Ответы [ 2 ]

6 голосов
/ 08 июля 2019

Инициализатор в этой декларации

int result = a * b + b + c ? b : a;

эквивалентно

int result = ( a * b + b + c ) ? b : a;

Подвыражение a * b + b + c оценивается как 20. Так как он не равен 0, тогда он контекстно преобразуется в true.

Таким образом, значение условного выражения является вторым подвыражением, равным b, равным 10.

Я думаю, что вы имеете в виду следующий инициализатор в объявлении

int result = a * b + b + ( c  ? b : a );
4 голосов
/ 08 июля 2019

Выражение a * b + b + c ? b : a равно сгруппировано как

(a * b + b + c) ? b : a

, что составляет результат b. Также обратите внимание, что c неявно преобразуется в int со значением 0.

...