2015-05-19 12 views
5

Codice: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); 
} 

penso:

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

Ma il Real:

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

Perché?

+2

Guarda la precedenza degli operatori. – chris

+12

Oh dio, per favore, PER FAVORE, per favore, non farlo davvero. –

+3

La precisione delle operazioni può essere complicata quando si usa '?:', Assicurarsi di usare '()' per sicurezza. – Havenard

risposta

17

L'operatore virgola ha il più basso precedence, ed è da sinistra a destra associativo. Il successivo operatore con priorità più bassa nell'espressione è l'operatore ternario ?:, che è associativo da destra a sinistra. Da qui l'espressione restituisce:

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

Così, lp.y > rp.y? SÌ. Impostare max_y = lp.y = 4. Quindi valutare l'ultimo (min_y = lp.y) (operatore virgola), quindi anche min_y = lp.y = 4.

Spero davvero che questo sia un esercizio e non un vero codice!

2

causa precedenza degli operatori, le linee

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; 

sono equivalenti a:

(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 è impostato lp.x non importa quali sono i valori.
min_y è impostato su lp.y indipendentemente dai valori.

È possibile rendere il codice facile da seguire e mantenere utilizzando:

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