2010-06-26 2 views
2

Я узнал, что автоматические переменные не инициализируются нулем. Таким образом, следующий код будет вести себя правильно и печатает случайные числа на экране:Странное поведение автоинициализации

#include <iostream> 
using std::cout; 
using std::endl; 

void doSomething() 
{ 
    int i; 
    cout << i << endl; 
} 

int main() 
{ 
    doSomething(); 
} 

Но почему не будет этого отрезала вести себя таким же образом?

#include <iostream> 
using std::cout; 
using std::endl; 

void doSomething() 
{ 
    int i; 
    cout << i << endl; 
} 

int main() 
{ 
    int j; 
    cout << j << endl; 
    doSomething(); 
} 

Этот фрагмент кода показывает:

0 
0 

Кто-нибудь знает, почему "J" и "я" вдруг на ноль здесь?

+7

вы назначаете особое значение числа 0 - это все-таки undefined, это просто 0! –

ответ

4

Использование неинициализированной переменной - это неопределенное поведение. Скорее всего, вы не получите такого же поведения на другом компиляторе. Единственное «почему» должно быть найдено внутри исходного кода для вашего конкретного компилятора C++.

+0

это правда! Я попробовал это на другой машине, и код вел себя правильно. –

+0

Ну, это неправильный ответ, хотя Stroustrup соответствует разделу 8.5 стандарта C++ (ISO-IEC 14882-2003) – nus

+0

Собственно, «почему» часто имеет мало общего с компилятором. Значение, как правило, будет тем, что было оставлено там, независимо от того, что было выполнено ранее, или независимо от того, какая ОС поставлена ​​там, если память была недавно выделена (последняя часто будет равна нулю по соображениям безопасности). –

0

Если для объекта задан инициализатор, этот инициализатор определяет начальное значение объекта. Если ни один инициализатор не указан, глобальное (§4.9.4), пространство имен (§8.2) или локальный статический объект (§7.1.2, §10.2.4) (совместно называемые статическими объектами) инициализируются до 0 соответствующего типа ,

Например:

// Global scope 

int a; // means ‘‘int a = 0 ;’’ 
double d; // means ‘‘double d = 0.0;’’ 

Локальные переменные (иногда называемые автоматические объекты) и объекты, созданные в свободной памяти (иногда называемые динамические объекты или объекты кучи) не инициализируются по умолчанию.

Например:

void f() 
{ 
    int x; // x does not have a well defined value 
    // ... 
} 

От Страуструпом, C++ Язык программирования, 3-е издание, с.83 - §4.9.5

+0

Er ... Я не знаю, если вы шутите, но все наоборот. , --- EDIT --- Хорошо, вы отредактировали, и теперь все правильно. –

+0

Извините, моя память иногда решается, исправлена. Я знаю, мне потребовались полные 2 минуты, чтобы посмотреть. – nus

+0

Хорошо, это то, что вам нужно. Я беру на себя смелость добавить комментарий «// Global scope» к вашему первому примеру. –

Смежные вопросы