C++ C++;运算符“?”:&引用;

C++ C++;运算符“?”:&引用;,c++,C++,代码: 但现实是: min_x=1 max_x=5 min_y=0 max_y=4 为什么?由于运算符优先级,行 min_x=1 max_x=5 min_y=4 max_y=4 相当于: lp.x > rp.x ? max_x = lp.x, min_x = rp.x : max_x = rp.x, min_x = lp.x; lp.y > rp.y ? max_y = lp.y, min_y = rp.y : max_y = rp.y, min_y = lp.y; min_x

代码:

但现实是:

min_x=1 max_x=5
min_y=0 max_y=4

为什么?

由于运算符优先级,行

min_x=1 max_x=5
min_y=4 max_y=4
相当于:

lp.x > rp.x ? max_x = lp.x, min_x = rp.x : max_x = rp.x, min_x = lp.x;
lp.y > rp.y ? max_y = lp.y, min_y = rp.y : max_y = rp.y, min_y = lp.y;
min_x
设置为
lp.x
,无论值是什么。
无论值是什么,
min_y
都设置为
lp.y

您可以使用以下方法使代码易于遵循和维护:

(lp.x > rp.x ? (max_x = lp.x, min_x = rp.x) : max_x = rp.x), min_x = lp.x;
(lp.y > rp.y ? (max_y = lp.y, min_y = rp.y) : max_y = rp.y), min_y = lp.y;

逗号运算符具有最小值,并且是从左到右关联的。表达式中下一个优先级最低的运算符是三元运算符,它是从右向左关联的。因此,表达式的计算结果为:

int min_x, max_x, min_y, max_y;
if ( lp.x > rp.x )
{
   max_x = lp.x;
   min_x = rp.x;
}
else
{
   max_x = rp.x;
   min_x = lp.x;
}
那么,
lp.y>rp.y
?对设置
max_y=lp.y=4
。然后计算最后一个
(min_y=lp.y)
(逗号运算符),因此
min_y=lp.y=4


我真的希望这是一个练习,而不是实际的代码

看看运算符的优先级。哦,上帝,请不要这样做。当使用
?:
时,操作的优先级可能会很棘手,请确保使用
()
以确保安全。@Havenard我认为这更多地与
WRT赋值的优先级有关。我肯定有一个复制品。我在找它。也许只是编译器在抗议这种该死的丑陋语法。
int min_x, max_x, min_y, max_y;
if ( lp.x > rp.x )
{
   max_x = lp.x;
   min_x = rp.x;
}
else
{
   max_x = rp.x;
   min_x = lp.x;
}
( (lp.y > rp.y) ? ( (max_y = lp.y), (min_y = rp.y) ): (max_y = rp.y) ), (min_y = lp.y);
                                                 // The ?: ends here ^