C++操作员"?:"

C++ operator "?:"

本文关键字:C++ 操作员      更新时间:2023-10-16

代码:

#include <cstdio>
struct Point 
{
    int x;
    int y;  
    Point(int t_x, int t_y)
    {
        x = t_x;
        y = t_y;
    }
};
int main() {
    Point lp(1, 4);
    Point rp(5, 0);
    int min_x, max_x, min_y, max_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;
    std::printf("min_x: %d max_x: %dn", min_x, max_x);
    std::printf("min_y: %d max_y: %dn", min_y, max_y);
}

我认为:

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.y > rp.y) ? ( (max_y = lp.y), (min_y = rp.y) ): (max_y = rp.y) ), (min_y = lp.y);
                                                 // The ?: ends here ^

那么,lp.y > rp.y?是的。设置max_y = lp.y = 4 .然后计算最后一个(min_y = lp.y)(逗号运算符(,所以min_y = lp.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;

等效于:

(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

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

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;
}