2014-04-09 12 views
6

Se ho compilare ed eseguire il codice seguente, la fase di stampa 0 invece di 10.Perché printf() sta stampando 0 anziché 10 nel codice seguente?

#include<stdio.h> 
main() 
{ 
    int Var=10; 
    { 
    char Var=Var; 
    printf("%d",Var); 
    } 
} 

Perchè questo sta stampando 0 e perché non 10?

+4

'= Var' si riferisce già a' char Var'. – Pietu1998

+0

Ora vorrebbe leggere questo: [Punto di dichiarazione in C++] (http://stackoverflow.com/questions/15746271/point-of-declaration-in-c#) ma è un collegamento C++ –

+0

[Punto di dichiarazione ] (http://msdn.microsoft.com/en-us/library/179x7xb9.aspx) –

risposta

19

Perché dichiarazione locale

char Var=Var; 

destra verificarsi di Var riferisce al locale Var, non quella superiore. Come ha commentato Alk, questo è undefined behavior da assegnare da una variabile non inizializzata.

Quindi la vostra dichiarazione non inizializza Var affatto, ovvero Var contiene immondizia. Nel tuo caso particolare, quella spazzatura sembra essere 0.

BTW, con due omonimi Var nella stessa funzione è davvero di cattivo gusto.

Come suggerisce this answer, dovresti compilare con gcc -Wall -Wshadow quindi riceverai alcuni avvisi sul tuo codice. (Aggiungere anche -g per ottenere le informazioni di debug per essere in grado di eseguire il debug con gdb)

+0

Quindi, non dovrebbe contenere rifiuti? – brokenfoot

+2

Quindi può stampare un valore spazzatura compreso '0' .. giusto !! –

+0

+1! Il compilatore o l'IDE possono avvisare del potenziale problema. Siamo spiacenti, sono abituato alle ispezioni IntelliJ. – Jayan

8

Supponendo che si sta utilizzando gcc, si vuole attivare il -Wshadow (http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html). Questo apparirebbe un errore, nella variabile interna che ha lo stesso nome di esterno. Lo zero è un valore casuale. Potrebbe stampare qualsiasi immondizia in quel luogo.

+0

Si potrebbe prendere in considerazione l'eliminazione della risposta ora, poiché è diventato ridondante dopo che [questo] (http://stackoverflow.com/a/22953927/2235132) è stato modificato. – devnull

+0

Questa risposta ha un collegamento a questa risposta. Va bene cancellare? Non lo so, è questo anche il posto giusto per fare questa domanda? – tpb261

2

provare questo

#include<stdio.h> 
main() 
{ 
    int Var1=10; 
    { 
    char Var=Var1; 
    printf("%d",Var); 
    } 
} 
Problemi correlati