2014-01-17 14 views
7

Der Titel ist ein bisschen vage, da ich nicht wirklich weiß, wie man diese Frage definiert.Ist die Reihenfolge dieser C-Anweisung gut definiert?

es mit dem folgenden Code zu tun hat:

for (match   = root, 
    m_matchBase = match->requestedBase, 
    m_matchLength = match->length; 

    match != NULL; 

    match   = match->next, 
    m_matchBase = match->requestedBase, 
    m_matchLength = match->length) 
{ 
    if (m_matchBase <= m_base && m_matchBase + m_matchLength > m_base) 
     break; 
    // other stuff... 
} 

die Aussagen sind in der for-Schleife nacheinander ausgeführt werden garantiert?

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

+1

Ja, es ist garantiert, [weitere Informationen] (http://stackoverflow.com/questions/54142/how-does-the-common-operator-work) –

+0

http://stackoverflow.com/questions/52550/what -does-the-operator-do-in-C# 52558 – clcto

+0

Ist das C oder C++? Wähle eins. Da du im Titel nur "C" erwähnt hast, gehe ich jetzt davon aus, dass du meinst, was du gesagt hast, und ich werde deine Tags entsprechend bearbeiten. –

Antwort

8

Ja, der Komma-Operator (der hier verwendet wird) wird die Operationen abfolgen. Dies bedeutet, dass Ihre Schleife sehr wahrscheinlich abstürzen wird, wenn match->next Null wird.

+2

schöner Fang mit dem Absturz – bolov

+0

schöner Fang! Vielen Dank –

2

Ja.

Der linke Operand eines Komma-Operators wird als void-Ausdruck ausgewertet; Es gibt einen Sequenzpunkt zwischen seiner Auswertung und dem des rechten Operanden. Dann wird der rechte Operand ausgewertet; Das Ergebnis hat seinen Typ und Wert.

Der Operator && hat auch einen Sequenzpunkt.

3

Ja, siehe C++ 11-Standard (5,18):

Ein Paar von Ausdrücken durch ein Komma getrennt ist von links nach rechts ausgewertet; die linke ist ein discarded- Wertausdruck

5

Die Ausdrücke von links nach rechts ausgewertet werden und es wird ein Sequenzpunkt nach jeder Auswertung sein. In C die Grammatik für eine für Anweisung ohne Erklärung aus dem Entwurf C99 Standard Abschnitt 6.8.5Iterationsanweisungen ist:

für (expression opt; Ausdruck opt; Ausdruck opt) Aussage

So die , in jeder Menge von Ausdrücken wird ein comma operator im Gegensatz zu nur einem Trennzeichen sein, was bedeutet, dass die Zuordnungen von links nach rechts ausgewertet werden. Dies wird in Abschnitt behandelt 6.5.17Comma Operator die sagt:

Der linke Operand eines Komma-Operator wird als nichtig Ausdruck ausgewertet; Es gibt einen Sequenzpunkt nach seiner Auswertung.Dann wird der rechte Operand ausgewertet; das Ergebnis seiner Art und Wert hat

Ob dieser wartbaren Code ist eine andere Frage ist, ist es wichtig zu beachten, dass, wenn match>next kehrt NULL werden Sie undefined behavior in den nachfolgenden Unterausdrücke werden aufgerufen wird. 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 eincheckbar ist.