Ich bekomme falsche Asm-Code für den folgenden Test-Code aus dem C-Compiler. Liegt das an undefiniertem Verhalten?Reihenfolge der Auswertung: undefiniertes Verhalten? oder Kompilierer defekt?
void SimulatedTest(void)
{
if ((a) || (b && c || d) == 1)
{
i = 2;
}
else
{
i = 4;
}
}
Welche Standard sagt:
6.5.16 Zuordnung Betreiber
Die Reihenfolge der Auswertung der Operanden ist nicht spezifiziert. Wenn ein Versuch gemacht wird, um das Ergebnis eines Zuweisungsoperator zu ändern oder den Zugriff auf nach der nächsten Sequenz Punkt das Verhalten ist nicht definiert
C Operator Präzedenz Regel
- ()
- ==
- || & &
Für den Problemfall: if ((a) || (b & & c || d) == 1) Compiler den Ausdruck in der folgenden Reihenfolge auswertet und erzeugt falsche Code
1. (b & & c || d) -> R1
2.R1 == 1 -> R2
3. (a) || R2
jedoch Compiler richtigen Code für die unten Fällen
Case1 erzeugt:. Wenn es keine relationale '==' Operation
if ((a) || (b && c || d))//compiler generates expected code
Case2: Wenn Klammerung ist
if (((a) || (b && c || d)) == 1)//compiler generates expected code
Case3 für die logische ODER-Verknüpfung hinzugefügt: keine
zwischen Operationen verwendet Klammernif (a || b && c || d == 1)//compiler generates expected code
Möchten Sie wissen, ob der Problemfall in undefinierte Verhalten Kategorie fällt oder nicht.
Grüße,
Mac
Nur eine Bemerkung über Ihre _C Operator Precedence rule_: '&&' hat eine höhere Priorität als '||', also müssen sie nicht in der gleichen Zeile sein – Garf365
Sie scheinen einen Satz Klammern zu haben, wenn Sie wollen Erhalten Sie Ihr 'erwartetes Ergebnis' – Shark
Fragen, die Debugging-Hilfe suchen ("warum funktioniert dieser Code nicht?") müssen das gewünschte Verhalten, ein spezifisches Problem oder einen Fehler und den kürzesten Code enthalten, der in der Frage selbst reproduziert werden muss. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels. – Olaf