Ist die Reihenfolge dieser C-Anweisung gut definiert?

7

Der Titel ist etwas vage, da ich nicht wirklich weiß, wie ich diese Frage definieren soll.

Es hat mit dem folgenden Code zu tun:

%Vor%

Werden die Anweisungen in der for-Schleife garantiert nacheinander ausgeführt?

Zum Beispiel ist m_matchBase = match->requestedBase garantiert nach match = match->next ?

zu laufen     
Jimmy Lu 17.01.2014, 19:05
quelle

4 Antworten

8

Ja, der Komma-Operator (der hier verwendet wird) wird die Operationen ablaufen lassen. Das bedeutet, dass Ihre Schleife sehr wahrscheinlich abstürzt, wenn match->next zu null wird.

    
Mark B 17.01.2014, 19:09
quelle
5

Die Ausdrücke werden von links nach rechts ausgewertet und nach jeder Auswertung gibt es einen Sequenzpunkt . In C die Grammatik für eine for-Anweisung ohne Deklaration aus dem Entwurf C99 Standardabschnitt 6.8.5 Iterationsanweisungen ist:

  

für (Ausdruck opt ; Ausdruck opt ; Ausdruck opt ) Anweisung

Also ist die , in jeder Menge von Ausdrücken ein Kommaoperator , im Gegensatz zu nur einem Trennzeichen, das bedeutet, dass die Zuweisungen von links nach rechts ausgewertet werden. Dies wird im Abschnitt 6.5.17 Komma-Operator behandelt, der besagt:

  

Der linke Operand eines Komma-Operators wird als void-Ausdruck ausgewertet; da ist ein   Sequenzpunkt nach seiner Auswertung. Dann wird der rechte Operand ausgewertet; Das Ergebnis hat seinen Typ und Wert

Ob dies ein wartbarer Code ist, ist eine andere Frage. Es ist wichtig zu beachten, dass, wenn match>next NULL zurückgibt, Sie aufrufen werden undefiniertes Verhalten in nachfolgenden Unterausdrücken. Was wahrscheinlich einen Weg darstellt, dies zu demonstrieren, ist eine schlechte Wahl im Stil, da es leicht zu übersehen ist und schwer in der aktuellen Form zu überprüfen ist.

    
Shafik Yaghmour 17.01.2014 19:11
quelle
3

Ja, siehe c ++ 11 Standard (5.18):

  

Ein durch Komma getrenntes Ausdruckspaar wird von links nach rechts ausgewertet; der linke Ausdruck ist ein verworfener-   Wertausdruck

    
tumdum 17.01.2014 19:10
quelle
2

Ja.

  

Der linke Operand eines Komma-Operators wird als void-Ausdruck ausgewertet; da ist ein   Sequenzpunkt zwischen seiner Auswertung und der des rechten Operanden. Dann das Richtige   Operand wird ausgewertet; Das Ergebnis hat seinen Typ und Wert.

Der Operator && hat auch einen Sequenzpunkt.

    
Samuel Edwin Ward 17.01.2014 19:09
quelle

Tags und Links