2015-05-19 25 views
5

Kodu:C++ operatörü ":?"

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

Ama Gerçek:

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

bence

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

Neden?

(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 olursa olsun değerlerin ne lp.x olarak ayarlanır: nedeniyle operatör önceliği

+2

Operatörlerin önceliğine bakın. – chris

+12

Oh tanrım, lütfen Lütfen bunu yapmayın lütfen. –

+3

'?:' Kullanırken, işlemlerin önceliği zor olabilir, emin olmak için etrafında '()' kullandığınızdan emin olun. – Havenard

cevap

17

virgül operatörü en düşük precedence vardır ve soldan sağa olan ilişkisel. İfadenizdeki bir sonraki en düşük öncelikli operatör, sağdan sola birleştirici olan ?: üçlü operatördür.

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

Yani, lp.y > rp.y: Dolayısıyla ifadeniz olarak değerlendirilir? EVET. max_y = lp.y = 4'u ayarlayın. Daha sonra son (min_y = lp.y) (virgül operatörü) değerini de min_y = lp.y = 4 da değerlendirin.

Gerçekten bu bir egzersiz ve gerçek bir kod olmasına rağmen gerçekten umut ediyorum!

2

, çizgiler

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; 

eşdeğerdir. Değerler ne olursa olsun
min_y, lp.y olarak ayarlanmıştır.

Sen kullanarak takip etmek ve korumak için kod kolay yapabilirsiniz:

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