条件运算符奇怪的输出

Conditional operator weird output

我曾经认为在下面这样的语句中使用条件运算符是可以的,但事实并非如此。在复杂语句中使用条件运算符有什么限制吗?

#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

为什么?

表达式 a * b + b + c ? b : a 分组

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

这说明结果是 b。另请注意,c 隐式转换为值为 0int

此声明中的初始值设定项

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 );