2015-05-19 2 views
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); 
} 

Я думаю:

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

Но Real:

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

Почему?

+2

Посмотрите на приоритет операторов. – chris

+12

О, боже, пожалуйста, ПОЖАЛУЙСТА, не делайте этого. –

+3

Приоритет операций может быть сложным при использовании '?:', Убедитесь, что вы используете '()' around, чтобы быть в безопасности. – Havenard

ответ

17

Оператор запятая имеет самый низкий precedence, и слева направо ассоциативно. Следующим оператором с наименьшим приоритетом в вашем выражении является тройной оператор ?:, который является ассоциативным справа налево. Поэтому ваше выражение в:

((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? ДА. Set max_y = lp.y = 4. Затем оцените последний (min_y = lp.y) (оператор запятой), поэтому min_y = lp.y = 4 также.

Я действительно очень надеюсь, что это упражнение, а не фактический код!

2

Благодаря старшинство операторов, линии

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; 
} 
Смежные вопросы