这个三元条件表达式是如何执行的呢?

How is this ternary conditional expression executed?

int x = 5,y = 10;
bool boolean = 0;
int k = (boolean ? ++x, ++y : --x, --y);
cout<<k;

当 boolean 为 0 时,它输出 9,但是当它为 1 时,它输出 10.I 知道这是因为优先级而发生但不能确切地弄清楚它是如何发生的,请帮助我理解这一点。

注意:我知道如果我使用括号我可以获得预期的输出,或者更好地编写一个干净的代码,我只是用它来理解编译器如何根据优先级评估这些表达式。

, 的优先级低于 ?:。这意味着完整的括号是:

int k = ((boolean ? (++x, ++y) : --x), --y);

如您所见,k 总是初始化为 --y 的值。只是如果 booleantrue++y 发生在它之前。


在查找表达式的完整括号形式时,将其视为构建表达式树(其中最低优先级运算符位于根部)。

在表达式中找到优先级最低的运算符,并将其左侧参数和右侧参数括在括号中。在括号内的子表达式中递归重复。

由于逗号运算符具有最低的 operator precedence,您的语句实际上等于

k = (boolean ? (++x, ++y) : --x), --y;

这意味着当 booleantrue 时,您既增加又减少 y。在这两种情况下,三元表达式的结果都被丢弃,k 只被赋值为 --y.

的结果

需要注意的是,这不是未定义的行为,因为逗号运算符引入了一个序列点。


要获得您期望的结果,您需要做

k = boolean ? (++x, ++y) : (--x, --y);

请注意,++x, ++y 周围的括号是绝对不需要的,但它确实使表达式更清晰。

鉴于上述出色的答案,应该改为:

if (boolean) {
     ++x;
     ++y;
} else {
     --x;
     --y;    
}
int k = y;

因为这样代码的意图就更 可读性 并且 更清晰 。这将帮助任何必须维护代码的人(包括原作者!),而不必浪费时间询问 SO 问题或担心 ,?: 的优先级或分配的后勤工作就这么复杂的表情都是。任何现代编译器都会将这个和上面的代码优化为相同的结果代码