Come funziona l'operatore di incremento post in GNU C? [chiuso]

-1

Mentre eseguo il programma seguente nel compilatore Turbo C, sto ottenendo l'output previsto, tuttavia, quando eseguo lo stesso programma usando il compilatore "gcc" in linux, sta dando un risultato inaspettato!

int main(){

    int i=1;

    i=2+2*i++;
    printf("i : %d\n",i);

    return 0;
}

Output in Turbo C = > i: 5 (Questo è come previsto!)
Output in GCC = > i: 4 (Perché l'incremento del post è ignorato in questo caso?)

Qualcuno può spiegare cosa succede esattamente nel processo di compilazione?

    
posta crown679 07.07.2015 - 21:02
fonte

2 risposte

2

Come altri hanno commentato, questo i=2+2*i++; è comportamento non definito . Per favore leggi il wikipage spiegandolo.

Vedi questa risposta per comprendere un po 'di più su UB.

Poi leggi i post di blog di Chris Lattner Cosa dovrebbe sapere su ogni programmatore di Undefined comportamento .

Per comprendere il reale comportamento del tuo programma C buggy, devi approfondire i dettagli dell'implementazione (e non vuoi). Se vuoi veramente capire cosa è successo usando GCC , potresti compilare il tuo programma badub.c con gcc -fdump-tree-all -O -fverbose-asm -S badub.c e poi perdere settimane del tuo tempo comprendendo i (centinaia) di badub.* file che questo comando di compilazione ha prodotto. Vale la pena il tuo tempo?

La lezione è evita UB a tutti i costi

Per aiutare di più a evitare UB, i recenti compilatori GCC sono a volte in grado di emettere avvisi su di esso. Dovresti almeno compilarlo con gcc -Wall -Wextra -g per ottenere tutti gli avvisi e le informazioni di debug. Impara a usare il debugger. Ulteriori informazioni su varie opzioni di -fsanitize= sul recente GCC. Impara e usa valgrind

A proposito, è l'anno 2015. Non usare TurboC, che è non conforme agli standard, non efficiente, non dà buoni avvertimenti, bug, proprietario, compilatore del secolo precedente. Usa un buon compilatore di software libero (come il recente GCC o Clang / LLVM . Entrambi possono fornire un codice migliore e avvisi migliori, se richiesto, rispetto al tuo vecchio TurboC schifoso ...)

    
risposta data 08.07.2015 - 04:50
fonte
1

3 cose stanno accadendo:

  1. Il valore di i viene letto in un registro, chiamalo R

  2. 2 + 2 * R viene memorizzato in i

  3. R + 1 è stato memorizzato in i.

La cosa complicata è che non ti è garantito che il # 2 succederà prima del # 3, o che il # 3 succederà prima del # 2. Questo è un esempio di ordine di operazioni non definito.

    
risposta data 08.07.2015 - 04:30
fonte

Leggi altre domande sui tag