2014-04-09 9 views
6

Jeśli mogę skompilować i uruchomić następujący kod, to drukuje 0 zamiast 10.Dlaczego printf() drukuje 0 zamiast 10 w następującym kodzie?

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

Dlaczego ten drukuje 0 i dlaczego nie 10?

+4

'= Var' już odnosi się do' char Var'. – Pietu1998

+0

Teraz chciałbyś przeczytać: [Punkt deklaracji w C++] (http://stackoverflow.com/questions/15746271/point-of-declaration-in-c#), ale jest to link C++ –

+0

[Point of Declaration ] (http://msdn.microsoft.com/en-us/library/179x7xb9.aspx) –

Odpowiedz

19

Ponieważ w miejscowym deklaracji

char Var=Var; 

prawo występowanie Var odnosi się do lokalnego Var, a nie górna. Jak skomentował Alk, jest to undefined behavior, aby przypisać z niezainicjowanej zmiennej.

Twoja deklaracja nie inicjuje w ogóle Var, tj. Var zawiera śmieci. W tym konkretnym przypadku śmieci te mają wartość 0.

BTW, mając dwie homonimy Var w tej samej funkcji jest naprawdę złym smakiem.

Zgodnie z sugestią this answer, powinieneś skompilować się z gcc -Wall -Wshadow, a następnie otrzymasz ostrzeżenia na swoim kodzie. (Również dodać -g uzyskać informacje debugowania, aby móc debugować z gdb)

+0

Czy zatem nie powinien zawierać śmieci? – brokenfoot

+2

Dzięki temu można wydrukować wartość śmieci, w tym '0' .. w prawo !! –

+0

+1! Czy kompilator lub IDE może ostrzec o potencjalnym problemie. Przepraszam, jestem przyzwyczajony do inspekcji IntelliJ. – Jayan

8

Zakładając, że używasz gcc, co chcesz, aby włączyć -Wshadow (http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html). Spowoduje to wyświetlenie błędu w wewnętrznej zmiennej o takiej samej nazwie jak zewnętrzna. Zero jest wartością losową. Może wydrukować wszystkie śmieci w tym miejscu.

+0

Możesz teraz usunąć odpowiedź, ponieważ stała się ona zbyteczna po tym, jak [to] (http://stackoverflow.com/a/22953927/2235132) zostało zmienione. – devnull

+0

Ta odpowiedź zawiera link do tej odpowiedzi. Czy można go usunąć? Nie wiem, czy jest to odpowiednie miejsce do zadawania tego pytania? – tpb261

2

spróbować

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