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 ...)