2016-03-20 31 views
16

Sono confuso sul seguente codice:Perché il valore di i == 0 in questo codice C++?

#include <iostream> 

int i = 1; 
int main() 
{ 
    int i = i; 
    std::cout << "i: " << i << "\n"; 
    return 0; 
} 

uscita:

i: 0 

avevo previsto l'esecuzione del codice di cui sopra sarebbe stampare 1. Qualcuno può spiegare la ragione di questo strano comportamento?

+24

Quando succedono cose strane, di solito è UB. – Maroun

+15

L'avviso "main.cpp: 13: 13: Variable 'i' non è inizializzato se usato all'interno della propria inizializzazione: dato da un compilatore ragionevole può essere un suggerimento sul problema, forse bloccando i livelli di avviso e ascoltando i loro consigli. – WhozCraig

+3

Quando assegni int i = i ;, viene inizializzato con il valore di i che hai appena dichiarato, quindi un valore indefinito –

risposta

62

Si sta inizializzando i con se stesso. Entrambi gli in int i = i; sono quelli interni e non quelli esterni. Questo è comportamento non definito e potresti ottenere 0 o può accadere qualcosa.

Questo è il modo corretto se si desidera assegnare l'esterno i all'interno i.

#include <iostream> 

int i = 1; 
int main() 
{ 
    int i = ::i; 
    std::cout << "i: " << i << "\n"; 
    return 0; 
} 

Live Demo


BTW, è necessario leggere attentamente tutte le avvertenze del compilatore. Se avete fatto si poteva vedere il problema da soli:

avviso 'i' è utilizzato non inizializzati in questa funzione

+12

Per azzerare un po ': "si può ottenere 0 o qualsiasi altro valore casuale nell'intervallo int" non è corretto al 100%. È UB, quindi qualsiasi cosa potrebbe accadere. Se il suo innesca un portale del tempo e questo ti spinge 100 anni nel futuro, questo sarebbe comunque un comportamento valido per il programma. Non che io sappia un compilatore fare questo (... che potrebbe essere causato dal fatto che quelli che l'hanno implementato sono scomparsi in futuro mentre testavano, prima che potessero condividere il loro lavoro) – johannes

+0

@johannes che è un livello completamente nuovo .. Grazie di cuore! –

+5

Avete snippet dallo standard che supportano il reclamo int i = i; è in realtà un comportamento indefinito. Una variabile non inizializzata non è un comportamento indefinito ha solo un valore non specificato. E poiché questa costruzione esatta appare nello standard (3.3.2) con l'affermazione che il valore sarà indeterminato, sono molto scettico sul fatto che questo sia UB. –