All'interno di un ciclo while, è l'ultimo separati da virgola dichiarazione garantito per funzionare ultima?

StackOverflow https://stackoverflow.com/questions/4072578

Domanda

Si consideri il seguente (banale) segmento di codice:

while (i++, i <= 10) {
  // some more code
}

Nel caso generale, C ++ consente separati da virgola affermazioni da valutare in qualsiasi ordine. Nel caso di un ciclo while, siamo almeno garantita (dalla specifica) che l'ultima affermazione (che viene utilizzato come condizione per il loop) essere valutata la scorsa?

È stato utile?

Soluzione

  

Nel caso generale, C ++ consente separati da virgola affermazioni da valutare in qualsiasi ordine.

Se ti riferisci alle virgole tra argomenti della funzione, questo è solo un separatore.

Nel tuo caso, si utilizza il operatore virgola , e che introduce un punto di sequenza che garantisce che tutti gli effetti collaterali del del comma sinistra operando si sono stabiliti prima di valutare quello giusto.

Quindi sì, è ben definito.

Dalla sezione 5,18 / 1 della ISO C ++ 98 Standard:

  

Una coppia di espressioni separati da una virgola viene valutata da sinistra a destra e il valore dell'espressione sinistra viene scartato. Lvalue-to-rvalue (4.1), da matrice a pointer (4.2), e la funzione-to-pointer (4.3) conversioni standard non sono applicati all'espressione sinistra. Tutti gli effetti collaterali (1,9) dell'espressione di sinistra, ad eccezione per la distruzione di provvisori (12,2), vengono eseguite prima della valutazione della giusta espressione. Il tipo e la   valore del risultato è il tipo e il valore dell'operando di destra; il risultato è un lvalue se operando a destra è.

Altri suggerimenti

Sì. L'operatore , (a meno che non sovraccarica!) Introduce un cosiddetto punto sequenza e garantisca effettivamente l'ordine di esecuzione da sinistra a destra.

I commenti sopra spiegato. E uno dei modi comuni di abusare questo metodo è

while(scanf("%d", &n), n){
    // do something
}

Questa leggerà intero fino a quando si legge zero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top