这个三元条件表达式是如何执行的呢?
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
的值。只是如果 boolean
是 true
,++y
发生在它之前。
在查找表达式的完整括号形式时,将其视为构建表达式树(其中最低优先级运算符位于根部)。
在表达式中找到优先级最低的运算符,并将其左侧参数和右侧参数括在括号中。在括号内的子表达式中递归重复。
由于逗号运算符具有最低的 operator precedence,您的语句实际上等于
k = (boolean ? (++x, ++y) : --x), --y;
这意味着当 boolean
是 true
时,您既增加又减少 y
。在这两种情况下,三元表达式的结果都被丢弃,k
只被赋值为 --y
.
的结果
需要注意的是,这不是未定义的行为,因为逗号运算符引入了一个序列点。
要获得您期望的结果,您需要做
k = boolean ? (++x, ++y) : (--x, --y);
请注意,++x, ++y
周围的括号是绝对不需要的,但它确实使表达式更清晰。
鉴于上述出色的答案,应该改为:
if (boolean) {
++x;
++y;
} else {
--x;
--y;
}
int k = y;
因为这样代码的意图就更 可读性 并且 更清晰 。这将帮助任何必须维护代码的人(包括原作者!),而不必浪费时间询问 SO 问题或担心 ,
或 ?:
的优先级或分配的后勤工作就这么复杂的表情都是。任何现代编译器都会将这个和上面的代码优化为相同的结果代码
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
的值。只是如果 boolean
是 true
,++y
发生在它之前。
在查找表达式的完整括号形式时,将其视为构建表达式树(其中最低优先级运算符位于根部)。
在表达式中找到优先级最低的运算符,并将其左侧参数和右侧参数括在括号中。在括号内的子表达式中递归重复。
由于逗号运算符具有最低的 operator precedence,您的语句实际上等于
k = (boolean ? (++x, ++y) : --x), --y;
这意味着当 boolean
是 true
时,您既增加又减少 y
。在这两种情况下,三元表达式的结果都被丢弃,k
只被赋值为 --y
.
需要注意的是,这不是未定义的行为,因为逗号运算符引入了一个序列点。
要获得您期望的结果,您需要做
k = boolean ? (++x, ++y) : (--x, --y);
请注意,++x, ++y
周围的括号是绝对不需要的,但它确实使表达式更清晰。
鉴于上述出色的答案,应该改为:
if (boolean) {
++x;
++y;
} else {
--x;
--y;
}
int k = y;
因为这样代码的意图就更 可读性 并且 更清晰 。这将帮助任何必须维护代码的人(包括原作者!),而不必浪费时间询问 SO 问题或担心 ,
或 ?:
的优先级或分配的后勤工作就这么复杂的表情都是。任何现代编译器都会将这个和上面的代码优化为相同的结果代码