C++运算符"?:"

Pen*_*eng 5 c++

码:

#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: %d\n", min_x, max_x);
    std::printf("min_y: %d max_y: %d\n", min_y, max_y);
}
Run Code Online (Sandbox Code Playgroud)

我认为:

min_x=1 max_x=5
min_y=0 max_y=4
Run Code Online (Sandbox Code Playgroud)

但真实:

min_x=1 max_x=5
min_y=4 max_y=4
Run Code Online (Sandbox Code Playgroud)

为什么?

vso*_*tco 17

逗号运算符具有最低优先级,并且是从左到右关联的.表达式中下一个最低优先级运算符是?:三元运算符,它是从右到左的关联.因此,您的表达式评估为:

( (lp.y > rp.y) ? ( (max_y = lp.y), (min_y = rp.y) ): (max_y = rp.y) ), (min_y = lp.y);
                                                 // The ?: ends here ^
Run Code Online (Sandbox Code Playgroud)

那么,lp.y > rp.y?是.设置max_y = lp.y = 4.然后评估最后一个(min_y = lp.y)(逗号运算符),min_y = lp.y = 4也是.

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