Ich habe eine Frage, wie der Compiler mit folgendem Code arbeitet:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Ich bin nicht sicher , warum das Ergebnis ist d = 11
.
Ich habe eine Frage, wie der Compiler mit folgendem Code arbeitet:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Ich bin nicht sicher , warum das Ergebnis ist d = 11
.
Antworten:
In
int d = (b == c++) ? (c+1) : (c-1);
:c++
ist der aktuelle Wert vonc
11. Separatc
wird auf 12 erhöht.b == 11
ist falsch, dab
ist 12.(b == c++)
ist falsch,(c-1)
wird verwendet. Außerdem muss das Inkrement vonc
bis zu diesem Punkt abgeschlossen sein.c
ist 12,c-1
ist 11.d
wird auf diesen Wert initialisiert, 11.quelle
Gemäß dem C-Standard (6.5.15 Bedingter Operator)
Also im initialisierenden Ausdruck dieser Deklaration
Die Variable
b
wird mit dem Wert der Variablen verglichen,c
da der Operator nach dem Inkrementieren den Wert seines Operanden vor dem Inkrementieren zurückgibt.Da die Werte nicht gleich sind (
b
wird auf 12 gesetzt, währendc
auf 11 gesetzt wird), wird der Unterausdruck(c-1)
ausgewertet.Nach dem Zitat gibt es einen Sequenzpunkt nach Bewertung des Zustands des Bedieners. Dies bedeutet, dass nach Auswertung der Bedingung
c
der Wert12
nach Anwenden des Post-Inkrement-Operators auf die Variable vorliegtc
. Infolgedessen wird die Variable d durch den Wert1
(12 - 1
) initialisiert .quelle
?:
. Da normalerweise in C das Kombinieren++
mit anderen Operationen mit demselben Operanden ein undefiniertes Verhalten ist. Und dieser Code funktioniert nur vorhersehbar, da er?:
verschiedene spezielle Schneeflockenregeln hat.Weil die Bedingung falsch ist, wird der
false
Fall eintreten :,c-1
aber da Siec
die Bedingung um erhöht habenc++
,c
ist dies jetzt der Fall12
. Das Ergebnis ist also 12 - 1, was 11 ist.EDIT: Was OP missverstanden hat, war das Post-Inkrement.
Was also tatsächlich passiert, ist folgender:
quelle
c++
die Bedingung erfüllt ist. Die Bedingung ist falsch, aber dann wird der ursprüngliche Wert vonc
zur Berechnung verwendetc - 1
, nicht die inkrementierte Version.c++
und++c
c++
ist der Operator nach dem Inkrementieren. Der Wert vonc++
ist 11, mit dem Nebeneffekt der Herstellungc == 12
.++c
hätte den Wert 12.Übersetzt in eine reguläre if-Anweisung würde Ihr Code folgendermaßen aussehen:
Der Hinweis hier ist, dass c erhöht wird, nachdem die Bedingung überprüft wurde. Sie geben also den
else
Status ein, aber c hat dort bereits den Wert 12.quelle
Siehe Ternary Operator.
Syntax
Also hast du geschrieben
In dieser Situation ist das Ergebnis 11, da nach Überprüfungen der 'c'-Wert erhöht wird (c + 1 = 12) und erst danach der' d'-Wert als c (12) -1 festgelegt wird, was 11 ist.
Wenn Sie zum Beispiel verwendet haben:
Der "c" -Wert würde vor dem Überprüfen der Anweisung erhöht, so dass er wahr wäre und der "d" -Wert c (12) +1 wäre, was 13 ist.
quelle