2011-01-22 11 views
5

Zgodnie z tabelami pierwszeństwa C, potrójny operator warunkowy ma skojarzenie od prawej do lewej: .Jeszcze jedno warunkowe pytanie dotyczące zagnieżdżania operatora

Czy więc można go bezpośrednio przekształcić w odpowiednik drabiny?

Na przykład potrafi:

x?y?z:u:v; 

być po prostu interpretować jako:

if(x) 
{ 
    if(y) 
    { z; } 
    else 
    { u; } 
} 
else 
{ v; } 

dopasowując indziej (:) z najbliżej nieparzysty jeśli()? Czy skojarzenie z prawem do lewego implikuje jakiś inny układ?

Odpowiedz

14

Przykład daliście mogą być interpretowane tylko w jeden sposób (jak if dałeś), czy operator trójargumentowy miał prawo do -połączenie w lewo lub w prawo.

których prawo do lewej sprawy skojarzeniem jest, gdy masz:

x = a ? b : c ? d : e; 

który jest interpretowany jako: x = a ? b : (c ? d : e), a nie jako x = (a ? b : c) ? d : e.

Aby dać bardziej realistyczny przykład:

int getSign(int x) { 
    return x<0 ? -1 : 
      x>0 ? 1 : 
        0; 
} 

ten jest identyczny z (prawdopodobnie bardziej czytelny) if/else-if:

int getSign(int x) { 
    if (x<0) 
     return -1; 
    else if (x>0) 
     return 1; 
    else 
     return 0; 
} 
5

Twoje założenie jest poprawne; Jednak często jest to mądry, aby dodać w nawiasach dla czytelności, np:

x?(y?z:u):v 
+2

+1 chociaż chciałbym powiedzieć, że jest nawet mądrzejsi * nie *, aby zagnieździć operatorów warunkowych kiedykolwiek w prawdziwym kodzie produkcyjnym :-) –

+0

@ Péter Török: Zgoda! – Ray

+3

Myślę, że "nieużywanie" jest przereklamowane. Zamień '?' Na 'then' i': 'na' else', a masz doskonale poprawną składnię wyboru w wielu językach. Piszę takie zagnieżdżone warunkowe przez cały czas, upewniając się, że każdy nowy? i: pojawia się w nowej linii z poprawnym wcięciem. Jest tak czytelny, jak wszystkie bloki if/else. –

Powiązane problemy