2013-03-25 12 views
6

Ho una variabile globale denominata var e una funzione foo. (Lo so che è una cattiva pratica, ma a volte è inevitabile) Mi chiedo se lo standard C (Sto compilando usando c99) dice cosa succede a var se provo ad eseguire:Restituzione di una variabile durante l'utilizzo di un incremento post in C

long foo(){ 
    return var++; 
} 

Grazie.

+0

Viene restituito il vecchio valore e il valore incrementale viene memorizzato. –

+0

Sì. Sembra che funzioni come previsto. Non sono sicuro che sia il giusto pensare di fare a giudicare dallo standard. – mgoszcz2

+1

Va bene, come le variabili globali. –

risposta

9

Risposta breve:

Si restituirà una copia di var e poi subito dopo incrementare il globale var.

Risposta lunga:

C11 6.5.2.4

"Il risultato del suffisso ++ operatore è il valore dell'operando Come effetto collaterale, il valore dell'oggetto operando è. incrementato .. "./-/ Il calcolo del valore del risultato viene sequenziato prima dell'effetto collaterale di che aggiorna il valore memorizzato dell'operando.

L'5.1.2.3 "esecuzione programma" standard specifica che tutti effetti collaterali devono essere state valutate prima che il programma incontra un punto sequenza. (È possibile trovare un numero di punti di sequenza pari a here).

C'è un punto di sequenza dopo una dichiarazione return (C11 6.8/4).

Ciò significa che l'espressione var++ è garantita per essere completamente valutata prima che qualsiasi codice in main() continui.

tuo codice macchina sarà simile a questa pseudo codice:

  • Conservare una copia locale del var sullo stack (o in un registro ecc)
  • Aumentare la globale var con 1.
  • Return dalla sub routine.
  • Utilizzare "copy-of-var".

Se si fosse utilizzato un incremento di prefisso, l'operazione di aumento sarebbe stata sequenziata prima che la copia fosse archiviata.

+0

Vale forse la pena ricordare che il "codice macchina" sopra mostra perché ++ su una variabile globale non è thread-safe. Un cambio di contesto tra "store copy" e "increase" che accetta 'var' (leggere o scrivere) può causare un comportamento inaspettato del programma. – Lundin

2

foo() restituirà il valore corrente di var e var viene aumentato.

4

Come var++ è un post-incremento, è fondamentalmente qualcosa di simile:

long foo(){ 
    long tmp = var; 
    var++; 
    return tmp; 
} 

Se si utilizza ++var invece, verrà restituito il valore incrementato (come sarà incrementare la variabile prima tornare la sua valore).