2010-07-22 18 views
63

Mam pytanie, co myślałem o wcześniej, ale zorientowali to nie jest trywialne odpowiedziećCzy ta inicjalizacja jest ważna?

int x = x + 1; 
int main() { 
    return x; 
} 

Moje pytanie brzmi, czy zachowanie programu jest określony lub nieokreślony, czy to ważne w ogóle. Jeśli jest on zdefiniowany, czy jest to wartość x znana w main?

+0

Interesujące. Przynajmniej GCC daje 1, nawet z '-std = C++ 98 -pedantic'. – Philipp

+0

Kompilowanie tego z MSVC9 (15.00.30729.01) daje 1. – akira

+0

Punkt kolejności przychodzi na myśl http://en.wikipedia.org/wiki/Sequence_point –

Odpowiedz

98

Jestem prawie pewien, że jest zdefiniowany, a x powinien mieć wartość 1. §3.6.2/1 mówi: "Obiekty z czasem trwania statycznego zapisu (3.7.1) muszą być inicjowane zerowo (8.5) przed jakimkolwiek innym inicjalizacja ma miejsce. "

Po tym wszystkim myślę, że wszystko jest całkiem proste.

+10

+1 i za odpowiedź na silny standard –

+12

Hm, zadziwiające, jak subtelne, ale ważne "zanim nastąpi jakakolwiek inna inicjalizacja." jest. – GManNickG

+4

Chciałbym, żeby to było nieokreślone, ponieważ wtedy moglibyśmy powiedzieć, że nie pisząc takich rzeczy trudno jest zrozumieć, co masz na myśli, nie patrząc na to w standardzie. –

6

Zmienna "x" zapisana w pliku .bss, która jest wypełniona zerami podczas ładowania programu. W związku z tym wartość "x" wynosi 0, gdy program zostanie załadowany do pamięci.

Następnie przed wywołaniem głównego wywoływane jest "x = x + 1".

Nie wiem, czy jest prawidłowe, czy nie, ale zachowanie nie jest niezdefiniowane.

11

Moje pytanie brzmi, czy zachowanie programu jest zdefiniowane lub niezdefiniowane, jeśli jest w ogóle ważne. Jeśli jest zdefiniowany, czy wartość x jest znana w main?

Ten kod zdecydowanie nie jest czysty, ale dla mnie powinien działać w sposób przewidywalny.

int x umieszcza zmienną w segmencie danych, który jest zdefiniowany jako zero przy uruchomieniu programu. Przed main() wywoływane są inicjatory statyczne. Dla x jest to kod x = x + 1. x = 0 + 1 = 1. W ten sposób main() zwróciłby 1.

Kod zdecydowanie zadziałałby w nieprzewidywalny sposób, jeśli x jest zmienną lokalną, alokowaną na stosie. Stan stosu, w przeciwieństwie do segmentu danych, z pewnością zawiera nieokreślone śmieci.

0

Przed głównym wywołaniem x musi być zainicjalizowane na 0, dlatego jego wartość musi wynosić 1, do którego wprowadzasz główne, a zwrócisz 1. To jest zdefiniowane zachowanie.

Powiązane problemy