2013-07-12 10 views
6
int a = a ; 

Zgodnie z zasadą operatora przypisania, powinien przeczytać wiersz od prawej do lewej. Po zobaczeniu "niedeklarowanego" kompilatora powinien dać błąd kompilacji.
Ale it is giving garbage value. Wyjaśnij to.Dlaczego to nie powoduje błędu kompilacji?

+0

Czy nie pozwoliłoby na zadeklarowanie "a" - ze śmieciami - i prawdopodobnie wydrukowanie tych śmieci? Również w oparciu o twoją logikę nic nie mogłoby być przypisane w deklaracji. 'int a = 1;' zakończyłoby się niepowodzeniem, ponieważ zadanie "czyta od prawej do lewej", a zatem "a" jest niezadeklarowane; Nie? – ChiefTwoPencils

+3

to ta sama wartość śmieci, która była w 'a', od początku, ponieważ nigdy nie zainicjowałeś' a'. – dandan78

+0

możliwy duplikat [to samo inicjalizacja "A a = a;" dozwolone?] (http://stackoverflow.com/questions/981714/is-self-initialization-aaa-allowed) Również tutaj: http://stackoverflow.com/questions/3173462/int-var-1-void-main -int-ii – jogojapan

Odpowiedz

2

Właściwie kompilator może dać ci wskazówkę. Mój mówi: "ostrzeżenie C4700: zmienna lokalna" a "używana bez zainicjowania".

Ale to nie jest błąd jako taki, deklaracja tylko nadaje nazwę zmiennej niektórym bitom pamięci bez dotykania jej, co jest ważne i szybkie. A przydział tutaj nie jest naprawdę przydziałem, tylko porusza się od prawej do lewej. Bez czeków. Bardzo wydajny, bardzo niebezpieczny.

Każda operacja jest legalna, ale cała sprawa jest bezcelowa. Kompilator robi to, co najlepsze - kompiluje kod, ale też ostrzega.

+1

Inicjalizacja nie "wystarczy podać nazwę zmiennej do niektórych bitów pamięci bez tou ching to ". _Deklaracja_ to robi. Inicjalizacja jest krokiem, w którym podajesz nazwany bit pamięci z wartością początkową. –

+0

Tak, dokładnie. Ale w tym przypadku zasadniczo nie ma inicjalizacji. To, co wydaje się być jednym, jest tylko deklaracją i zadaniem. – akalenuk

+0

Och, prawdopodobnie powinienem edytować moją odpowiedź, aby uniknąć nieporozumień. Dzięki! – akalenuk

9

§3.3.2/1:

Punkt zgłoszeniu o nazwie natychmiast po jej całkowitym declarator (punkt 8), a przed jego inicjatora (jeśli istnieje), za wyjątkiem podanych poniżej. [Przykład:

int x = 12; 
{ int x = x; } 

Tutaj drugi x jest inicjowany własnej wartości (nieokreślona). -end example]

+0

Uwaga, w najnowszym szkicu C++ 1y [ to się zmieniło] (http://stackoverflow.com/questions/23415661/has-c-standard-changed-w-respect-to-the-use- of- end-termi- wartości- i -und). –

Powiązane problemy