2015-05-19 23 views
5

Kod:C++ operator ":"

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

myślę:

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

Ale Real:

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

Dlaczego?

+2

Spójrz na pierwszeństwo operatorów. – chris

+12

O Boże, proszę proszę PROSZĘ, nie rób tego. –

+3

Pierwszeństwo operacji może być trudne, gdy używasz '?:', Upewnij się, że używasz '()' wokół, aby być bezpiecznym. – Havenard

Odpowiedz

17

Operator przecinek ma najniższy precedence, i od lewej do prawej stowarzyszeniowej. Kolejnym operatorem o najniższym priorytecie w wyrażeniu jest operator trójskładnikowy ?:, który jest skojarzony z prawej do lewej. Stąd Twój wyrażenie do:

((lp.y > rp.y) ? ((max_y = lp.y), (min_y = rp.y)): (max_y = rp.y)), (min_y = lp.y); 
               // The ?: ends here^

Więc lp.y > rp.y? TAK. Ustaw max_y = lp.y = 4. Następnie przetestuj ostatni (min_y = lp.y) (operator przecinka), a więc min_y = lp.y = 4 również.

Naprawdę mam nadzieję, że jest to ćwiczenie, a nie rzeczywisty kod!

2

Ze względu na pierwszeństwo operatora, linie

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; 

są równoważne:

(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 jest ustawiony na lp.x bez względu na to, jakie wartości są.
min_y jest ustawiony na lp.y bez względu na wartości.

Można uczynić Twój kod łatwy do naśladowania i utrzymać za pomocą:

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