2016-10-31 5 views
-4

У меня есть этот код:компилятора возвращает неинициализированное значение

#include <iostream> 

using namespace std; 


void funcA() 
{ 
    int a = 4; 
} 

void funcB() 
{ 
    int b; 
    cout << b; 
} 

int main() 
{ 
    funcA(); 
    funcB(); 

    cout << endl; 

    return 0; 
} 

Если я скомпилировать без оптимизации: g++ -o run file.cpp я получаю в результате: 4

Если я скомпилировать его с: g++ -O3 -o run file.cpp я получаю в результате : 0

Теперь, я бы ожидать, в обоих случаях

1) не возвращают ничего из funcA, так как мы просто называть его и в удовольствие cA мы просто присваиваем значение переменной (ничего не возвращаем).

2) Верните предупреждение от компилятора относительно funcB, так как мы не инициализируем значение b.

Я нашел this answer лучше (подробнее).

+3

Это неопределенное поведение. То, что вы получаете, это то, что вы получаете, потому что неопределенная причина – NathanOliver

+4

Ну, неопределенное поведение не определено, и споры об этом, таким образом, бесполезны. И если вы хотите получать предупреждения, включите предупреждения. –

+2

* Теперь я ожидал бы в обоих случаях ... * - Нет, неопределенное поведение не работает так, как вы «ожидаете». – PaulMcKenzie

ответ

3

Чтобы получить полезные предупреждения, вы должны попросить их. Запустите gcc с параметрами -Wall -Wextra и будьте поражены.

+0

Хорошо, спасибо! Я видел их! – George

1

В C++ компилятор (без предупреждающих флагов) не предупредит вас, если вы не инициализируете значение.

Если вы инициализируете переменную, то на самом деле вы делаете выделение x байтов данных (в данном случае, скорее всего, 4). Поэтому, даже если вы не инициализируете его, есть «что-то».

В этом случае он, вероятно, повторно использует фрагмент памяти, ранее принятый a, поэтому вы видите 4 на выходе.

Если вы запустили g ++ с флагом -03 (самая большая оптимизация), все значения инициализируются на 0. Вот почему вы видите 0 на выходе.

+1

* «Если вы запустите g ++ с флагом -03 (самая большая оптимизация), все значения инициализируются на 0. Вот почему вы видите 0 на выходе.» * Это не так. –

+0

Да, вы правы, g ++ не имеет флага для установки унифицированных значений на 0. – SlowerPhoton

+1

С оптимизацией, установленной высокой, компилятор не может испускать код для funcA, поскольку нет исполняемых инструкций. И, видя, что funcA не имеет никакой цели, компилятор или линкер может устранить его. –