三目运算符输出结果奇怪

3

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

#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 为什么?

1
运算符的顺序很重要。 - Radosław Cybulski
是的。我刚刚用 () 进行了检查 :| - BartekPL
?: 运算符的优先级是所有运算符中第二低的。 - Radosław Cybulski
2
是的。 : 有点特殊,更像是一个分隔符。一旦解析器找到 ? 运算符,?: 之间的任何内容始终是 ? 运算符的真块,而 : 后面的内容则是假块。 - Radosław Cybulski
2个回答

6
这个声明中的初始化器
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
表达式 a * b + b + c ? b : a分组 为:
(a * b + b + c) ? b : a

这导致最终结果为b。同时请注意,c被隐式转换为一个值为0int


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接