C++ 这个三元条件表达式是如何执行的? intx=5,y=10; 布尔值=0; int k=(布尔?++x,++y:--x,--y); 如果

C++ 这个三元条件表达式是如何执行的? intx=5,y=10; 布尔值=0; int k=(布尔?++x,++y:--x,--y); 如果,c++,ternary-operator,operator-precedence,C++,Ternary Operator,Operator Precedence,,的优先级低于?:。这意味着完整的括号是: int x = 5,y = 10; bool boolean = 0; int k = (boolean ? ++x, ++y : --x, --y); cout<<k; 如您所见,k总是初始化为--y的值。只是如果boolean是true,++y发生在这之前 查找表达式的全括号形式时,请将其视为构造表达式树(其中最低优先级运算符位于根) 在表达式中查找优先级最低的运算符,并将其左侧参数和右侧参数括起来。在刚刚插入括号的子表达式中递归重

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

int x = 5,y = 10;
bool boolean = 0;
int k = (boolean ? ++x, ++y : --x, --y);
cout<<k;
如您所见,
k
总是初始化为
--y
的值。只是如果
boolean
true
++y
发生在这之前


查找表达式的全括号形式时,请将其视为构造表达式树(其中最低优先级运算符位于根)


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

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

int k = ((boolean ? (++x, ++y) : --x), --y);
这意味着当
boolean
true
时,您可以增加和减少
y
。在这两种情况下,三元表达式的结果都会被丢弃,
k
只分配了
--y
的结果

应该注意的是,这不是未定义的行为,因为逗号运算符引入了序列点


为了得到你期望的结果,你需要做

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

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

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

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

因为这样代码的可读性更高,并且在意图上更清晰。这将有助于任何必须维护代码的人(包括原始作者!),而无需任何人浪费时间问问题或担心
?:
的优先级,或对如此复杂的表达式赋值的逻辑。任何现代编译器都会将此代码和上述代码优化为相同的结果代码

在逗号运算符和前缀递增减量后读取。您希望得到什么输出?请不要编写这样的代码。这就是为什么您应该编写可读代码的原因。我强烈建议使用完整的
if
-
else
块当您想在
if
else
情况下执行多项操作时。此外,我发现在处理复杂表达式时使用自己的括号有助于提高可读性,即使我知道运算符优先级可以满足我的要求。谢谢你。@NathanOliver好吧,在这种情况下这很重要。:)@NathanOliver写这样的代码你应该得到UB。我不是一个编译器,我不想解析代码。这不是因为
?:
?谢谢,你的回答很有帮助,你能告诉我在给定优先级的情况下,将特定表达式插入括号的步骤吗,我无法决定为这样的表达式插入哪些组。@KaranJoisher我试着相应地扩展答案。@KaranJoisher为什么不插入括号以消除所有歧义:
int k=(布尔?(++x,++y):(-x,--y))
可以立即清楚地知道哪些部件要放在哪里。无需试图找出运算符的优先级。@AndreKostur我知道,如果我使用括号,我可以简单地得到预期的输出,我只是试图理解优先级概念,如果我不使用括号,编译器会做什么呢?@AndreKostur因为并不是所有你试图理解的代码都是你自己编写的——而亲自尝试这些东西是让它留在你脑海中的一个好方法,或者至少给你一个参考,当你遇到其他人的“聪明”时,你可以回到那里OP的帖子巧妙地运用了排序,但同时也是一种“聪明”的方式,它会让你的同事讨厌你。那些不支持你的选民能解释一下原因吗?我是否错过了一些重要的预优化机会,这些机会对我来说是如此重要,我的代码毫无意义?请给我一个很好的理由写一个初始化作为OP的。人们可能会投反对票,不是因为你的答案在技术上不正确,而是因为它并不是问题的真正答案。问题是,“这个代码是如何工作的?”你的答案是“谁在乎,那样写代码是愚蠢的。”我100%同意,并且认为这是一个有用的答案,所以我没有否决它。但是,在发布这些类型的答案时,你会冒风险。你有足够的代表性,你不必担心它。:-)任何现代编译器都会将这两种方法优化为相同的结果代码。不确定这一点,使用三元运算符的代码生成的汇编代码(有时是相同的)比
if
-
else
if (boolean) {
     ++x;
     ++y;
} else {
     --x;
     --y;    
}
int k = y;