2016-03-23 13 views
1

Sorry, wenn es eine dumme Frage ist, aber ich konnte nicht viele Informationen finden. Ich will nur das Ergebnis eines Vergleichs in einer Variablen zugewiesen werden, wie folgt aus:Vergleich in Variablenzuweisung

int a = 3, b = 2; // In actual code they're not integer literals 
int result = a > b; 

Beim Kompilieren, gcc (mit -Wall) beschwert sich nicht, und Blick auf die Montage Ausgang fand ich es zu cmp übersetzt ist und setle (oder setg etc.). Ich frage mich, ob es ungültiger (C) Code ist oder als schlechte Übung angesehen wird, da ich sehe, dass es nie benutzt wird.

+0

Es ist gültig ..... – Maroun

+0

'Im tatsächlichen Code sind sie nicht ganzzahlige Literale' was sind sie im ursprünglichen Code? –

+1

Die '>' und andere solche Operatoren werden zu einem int, '0' oder '1' ausgewertet. –

Antwort

3

Dies ist ein perfekt gültiger C-Code. Das Verhalten wird in Abschnitt 6.5.8.6 des C99-Standard spezifiziert:

Jeder der Operatoren < (weniger als), > (größer als), <= (weniger als oder gleich), und >= (größer als oder gleich) soll 1 ergeben, wenn die angegebene Beziehung wahr ist, und 0, wenn es falsch ist. Das Ergebnis hat den Typ int.

Wenn Sie Legacy-Code pflegen, die mit Pre-C99-Compiler, consider using <stdbool.h> and bool type anstelle eines int kompatibel sein müssen.

-3

Was @dasblinkenlight gesagt hat, ist richtig. Außerdem, und ich bin mir nicht bewusst mit Ihrem Code, müssen Sie möglicherweise die Variable "Ergebnis" als flüchtig definieren, um Compiler-Optimierung zu vermeiden, wobei 2 und 3 magische Werte sind und bereits das Ergebnis des Vergleichs bekannt ist. Also, versuchen Sie zu ersetzen:

int result = a > b; 

mit

volatile int result = a > b; 

Lesen Sie mehr über flüchtige Nutzung.

+0

Warum möchten Sie die Optimierung vermeiden? –

+0

Warum denken Sie, dass "volatile" relevant sein könnte? Der dem Ergebnis zugewiesene Wert ist der Wert des Vergleichs, wenn die Zuweisung ausgeführt wird. Auch wenn sich 'a' oder' b' (oder beide) nachträglich ändern, ändert das den Wert in 'result' nicht, egal ob 'volatile' markiert ist oder nicht. Ihre Zeile "Lesen Sie mehr über die Verwendung von Voltatiles" ist kein Link, obwohl der Inhalt darauf hinweist, dass dort irgendwo ein Link vorhanden sein sollte. –

+0

Falls diese Variable später verwendet wird; Zuweisung nicht mehr nur zur Verwendung; Dies wird optimiert. –

Verwandte Themen