2013-07-04 13 views
5

Sto solo imparando un po 'di C, o meglio, ho un'idea di alcuni dettagli arcani. E stavo usando VTC avanzata di programmazione C, in cui ho scoperto che i punti di sequenza sono:Punti sequenza in chiamate C/funzione

  • virgola
  • Comma
  • e/o
  • operatore ternario
  • chiamate funzione logica (Qualsiasi espressione usata come argomento per una chiamata di funzione è finalizzato viene effettuata la chiamata)

sono tutti corretti ?. Per quanto riguarda l'ultimo che ho provato:

void foo (int bar) { printf("I received %d\n", bar); } 

int main(void) 
{ 

    int i = 0; 

    foo(i++); 

    return 0; 

} 

Ed ha ancora stampare 1, che secondo quanto ragazzo del VTC detto e se mi undertood correttamente, dovrebbe, giusto?. Inoltre, questi paren nella funzione chiamano lo stesso dei parents di raggruppamento? (Voglio dire, la loro precedenza). Forse è perché i parenti hanno precedenza più alta di ++ ma ho anche provato foo ((i ++)); e ho ottenuto lo stesso risultato. Solo facendo pippo (i = i + 1); ceduto 1.

Grazie in anticipo. Per favore, considera che io vengo dal Sud America, quindi se non fossi chiaro o non avesse senso per favore, per favore, dimmi.

Cordiali saluti, Sebastian.

+0

Compilare con le informazioni di debug e tutti gli avvisi (ad esempio 'gcc -Wall -g' su Linux o forse Mac) e imparare a usare il debugger (' gdb') –

+0

È difficile capire perché pensi che dovrebbe stampare 1 quando il il valore di 'i ++' è 0. "Solo facendo foo (i = i + 1); restituito 1" - perché il valore di 'i = i + 1', che è equivalente a' ++ i', è 1. –

+0

Conosco il valore di i ==, ma penso che le chiamate di funzione non siano realmente un punto di sequenza come, ad esempio, la virgola è perché foo ((i ++, i)) è effettivamente 1. E sì, so che la virgola dà l'ultimo valore ma comunque. Mi sono confuso dal fatto che "Qualsiasi espressione viene valutata prima" non è proprio il caso, anche se postfix è come un'operazione a 2 step se qualcuno dice "TUTTE le operazioni" .. beh .. Io pensavo letteralmente ALL ALL – SJPRO

risposta

4

Il valore di sequenza i++ viene valutato prima dell'invocazione di foo.

Considerate questo caso (Non sto stampando bar!):

int i = 0; 
void foo (int bar) { printf("i = %d\n", i); } 
int main(void){ 
    foo(i++); 
    return 0; 
} 

i = 1 devono essere stampati.

+2

Forse sarebbe una buona idea stampare 'bar' per evitare confusione del lettore ... – Potatoswatter

+0

@Potatoswatter Ma stampare' bar' Perderò l'attenzione.Penso che dovrei dire *** "Non sto stampando 'bar'" ***. – johnchen902

+0

Sì, funziona per me. Scusate per il downvote temporaneo prima, sto diventando sl oppy reading – Potatoswatter

10

Il codice funziona come dovrebbe e non ha nulla a che fare con i punti di sequenza. Il punto è che l'operatore ++ postfissa restituisce il valore non incrementato (ma incrementa comunque la variabile di 1).

Fondamentalmente:

  • i++ - Incremento i per uno e restituire il valore precedente
  • ++i - Incremento i per uno e restituire il valore dopo l'incremento

La posizione dell'operatore dà un leggero suggerimento per la sua semantica.

+0

Ciao! , è stato veloce !! .. Sì, sapevo di suffisso e prefisso ++ e -. Ma mi sono confuso da quello che ha detto il VTC (riguardo a tutte le operazioni che sono state completate quando si raggiungono e in sequenza i ponts e, naturalmente, le chiamate di funzione sono una di queste). Grazie per il vostro aiuto! – SJPRO

3

C implementa semantica pass-by-value. Il primo i ++ viene valutato e il valore viene mantenuto, quindi i viene modificato (ciò può accadere in qualsiasi momento tra la valutazione e il successivo punto di sequenza), quindi la funzione viene inserita con il valore di backup come argomento.

Il valore passato in una funzione è sempre uguale a quello che si vedrebbe se si utilizza l'espressione argomento in qualsiasi altro modo. Un altro comportamento sarebbe abbastanza sorprendente e renderebbe difficile il refactoring delle sottoespressioni comuni in funzioni.

+0

Grazie mille. Appena nuovo per il sito. Ho scoperto che non posso "verde" tutte le risposte. Erano tutti davvero utili, sul serio, ancora una volta, grazie. – SJPRO

+0

@SJPRO * "verde" *. Il verbo formale è "accetta". A proposito, mi fai ricordare un poema cinese: 2 又 綠 江 南岸 – johnchen902

+0

formale o corretto? se il primo, potrei sostenere che non stavo cercando di essere formale haha. E ho accettato TUTTI quelli che ho potuto solo "verde" uno =). Che cos'è quella roba cinese ?, per favore, non voglio google .. – SJPRO

1

Quando si esegue qualcosa come: int i = 0, j;

j = i ++;

il valore di i viene utilizzato per primo e quindi incrementato. quindi nel tuo caso vengono usati i valori di i che è 0 (quindi passati alla tua funzione foo) e poi incrementati. i valori incrementati di i (ora 1) saranno disponibili solo per main in quanto è la sua variabile locale.

Se si desidera stampare 1 foo chiamano in questo modo:

foo (++ i);

questo stamperà 1. Resto sai, perché!

Problemi correlati