2016-10-03 1 views
0

Ich versuche, zwei Integer-Variablen mit derselben Konstante zu vergleichen. Offensichtlich haben beide Variablen in diesem Fall die gleichen Standardwerte. Ich versuchte, die Vergleichsaussage so zu vereinfachen:C if-Anweisung vergleicht zwei Integer-Variablen mit derselben Konstante

if (po->app_tag == po->inst_id == 0) 
    return 1; 

Es hat nicht funktioniert.

Ich musste es Code wie:

if ((po->app_tag == 0) && (po->inst_id == 0)) 
    return 1; 

es funktioniert. Kann mir jemand den Unterschied zwischen den beiden erklären? Irgendwie finde ich, dass der C-Compiler eine Vorkehrung für diese Art von Syntax haben sollte, wenn es um den Vergleich zweier ganzzahliger Variablen geht. Ich kann mich irren, wenn ich danach frage ... :), aber ich will einen Grund verstehen. Warum liege ich hier falsch?

+1

Wissen Sie, welche Werte der Ausdruck 'a == b 'zurückgeben kann? –

+0

Wenn Sie eine Variable mit dem Ergebnis eines anderen Vergleichs vergleichen, vergleichen Sie sie mit 0 oder 1, was wahrscheinlich nicht Ihren Vorstellungen entspricht: http://stackoverflow.com/questions/18097922/return-value-of- operator-in-c –

+0

@EugeneSh. ja .. machte einen grundlegenden Fehler ... –

Antwort

3

Durch die Assoziativität des == Operator (von links nach rechts zuordnet),

po->app_tag == po->inst_id == 0 

wird interpretiert als:

(po->app_tag == po->inst_id) == 0 

Das ist, wie die Sprache definiert ist.

Mit

(po->app_tag == 0) && (po->inst_id == 0) 

behebt das Problem, indem sie po->app_tag == 0 und po->inst_id == 0 unabhängig zu bewerten und einen Booleschen UND zwischen den beiden durchführen.

Weitere Informationen zu Operatorpriorität und Assoziativität finden Sie unter http://en.cppreference.com/w/c/language/operator_precedence.

+0

Danke für detaillierte Erklärung .. !! –

1

po->app_tag == po->inst_id == 0 als (po->app_tag == po->inst_id) == 0 interpretiert werden - das heißt, dass die Sache sind die beiden Variablen einzeln nicht zu 0 verglichen wird, aber das Ergebnis von po->app_tag == po->inst_id. Diese Operation gibt 1 zurück, wenn die beiden Werte gleich sind, und 0, wenn dies nicht der Fall ist. In der Tat entspricht po->app_tag == po->inst_id == 0po->app_tag != po->inst_id, was nicht das ist, was Sie wollten.

+0

Vielen Dank für die detaillierte Erklärung .. !! –

0

So funktioniert der C/C++ - Compiler. Ein Vergleichsausdruck kann nur zwei Variablen vergleichen. Wenn Sie mehr wollen, müssen Sie den logischen Ausdruck AND (&&) oder OR (||) verwenden. Wenn Sie eine Variable mit mehr als zwei const Werten vergleichen möchten, können Sie die switch Anweisung verwenden.

Verwandte Themen