2012-04-04 26 views
0

Ich habe ein Problem in C.Operator Vorrang und ternäre Operator

#include<stdio.h> 
int main() 
{ 
    int a = 10, b = 0, c = 7; 
    if (a ? b : c == 0) 
     printf("1"); 
    else if (c = c || a && b) 
     printf("2"); 
    return 0; 
} 

Dieser Code druckt 2, aber ich denke, ein b: c kehrt b = 0 und 0 == 0 ergibt 1. Können Sie das erklären Code?

+3

Warum suchen Sie nicht einfach die Vorrang-Tabelle für den Operator? Solche Fragen sind sonst nutzlos. –

+0

Wenn Sie wissen, dass es Vorrang hat, warum verwenden Sie nicht die [Rangordnung] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence), um herauszufinden, wo Klammern gesetzt werden sollen? –

Antwort

3

Ihre Bedingungen sind nicht richtig geschrieben. if-Anweisung

Im ersten:

if (a ? b : c == 0) 

wenn Sie die Werte setzen, dann wird es

if(10 ? 0 : 7 == 0) 

Mittel, wird es immer wieder zurückkehren 0.

Das ist, warum geht die Steuerung zum anderen Teil und dort wird es

else if (7 = 7 || 10 && 0) 

Da Sie den Operator "=" hier verwendet haben (c = c), wird es immer wahr sein, daher wird "2" ausgegeben.

Jetzt möchten Sie, dass der Code "1" zurückgeben sollte, dann ändern Sie Ihre if-Anweisung auf diese Weise.

if((a ? b:c) == 0){...} 

, weil der Operator "==" einen höheren Vorrang hat als der ternäre Operator.

4

Der Bedingungsoperator (?:) hat eine der niedrigsten Präzedenzfälle. Insbesondere ist es niedriger als ==. Ihre Aussage bedeutet dies:

if(a ? b : (c == 0)) { ... } 

Nicht dies:

if((a ? b : c) == 0) { ... }