c > c++? "T" : "F" (order of evaluation)

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

c > c++? “T” : “F” (order of evaluation)
Hi,

es geht um folgenden simplen Code:

#include <stdio.h>
void main() {
    int c = 3;
    printf("%s\n", c > c++ ? "T" : "F");
}

ein

gcc test.c; ./a.out

liefert…
je nach Compiler T oder F.

Konkret kommt bei gcc-4.6.3 F, bei gcc-4.7.2 und gcc-4.9.2 T.

Kann mir jemand anhand der Spezifikation sagen welche Version sich falsch verhält?

Edit:
Titel geändert


Dein Code ist kaputt, nicht der Compiler. Was du tust ist undefined behaviour.

[quote=C11]If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.
[/quote]

1 „Gefällt mir“

Willkommen in der Welt von C wo alles erlaubt und nichts definiert ist!

Im Prinzip steht es dem Compiler laut Standard frei in welcher Reihenfolge er Operanden zu fast allen Operator (Ausnahmen sind &&,||, ?:,…) auswertet.
Also er darf sowol zu erst “c” oder “c++” auswerten und dann entscheiden ob nun c > c++ wahr oder falsch ist.

Das ganze ist noch nen ganzes Stück komplizierter und kann unterm Suchbegriff “evaluation order” nachgelesen werden. (Beispielsweise hier)
Ich glaube das ganze ist sogar undefined behaviour und der compiler dürfte beliebiges tun (abstürzen, Endlosschleife, 42 zurückgeben etc.)…

Richtig lösen tut diese Problem zum Beispiel Java. Dort wird immer von links nach rechts evaluiert. Dazu gibt es irgendwo auch tolle AuD Folien wo man mal i++ + ++i ausrechnen soll…


ja, dafuer ist in Java nicht definiert, in welcher Reihenfolge Zeilen abgearbeitet werden…


Ja, gleich der erste Satz sagt ja eigentlich alles.

(link)

Hab ich in der Zwischenzeit dann auch gefunden. Dennoch Danke.


Naja, es ist schlimmer als unspecified - es ist tatsächlich undefined behaviour. Unspecified würde nur bedeuten, dass der Compiler sich das eine oder das andere Verhalten aussuchen kann - im konkreten Fall kann der Compiler aber tatsächlich komplett beliebigen Code generieren.


Meinst du Code-Zeilen? Ist das in C nicht auch vom Compiler abhängig?