Я пытался узнать поведение POD в случае перехода. Ниже приведена программа, которую я использовал:

#include <iostream>
void f(int i){
    if (i < 10)
         goto jump1;
    int j;
    jump1:
         std::cout << j;
}

int main()
{
    f(9);
}

Почему j инициализируется 0?

-2
Sumit Gera 25 Янв 2015 в 14:23

2 ответа

В стандарте нет ничего, чтобы инициализировать локальную нестатическую переменную нулем, это просто пользовательское/случайное поведение вашего компилятора. Чтение значения из неинициализированной переменной может вызвать неопределенное поведение. goto не имеет ничего общего с этим объявлением.

1
masoud 25 Янв 2015 в 14:27
Я ожидал значения мусора в j. И это неопределенное поведение моего компилятора стоило мне 3 минусов.
 – 
Sumit Gera
25 Янв 2015 в 14:28
Для меня тот ноль, который приходит из неинициализированной переменной, это мусор!
 – 
masoud
25 Янв 2015 в 14:29
Неопределенное поведение может означать, что значение является мусором, значение равно 0, или компилятор может просто удалить все операции, зависящие от этой переменной, или может заставить демонов вылететь из вашего носа.
 – 
bolov
25 Янв 2015 в 14:29

Сам прыжок goto в порядке. Автор [stmt.dcl]/3:

Возможна передача в блок, но не в обход объявлений с инициализацией. Программа, которая переходит от точки, где переменная с автоматическим сроком хранения не находится в области видимости, к точке, где она находится в области видимости, является неправильно сформированной, если только переменная не имеет скалярного типа [...] и не объявлена ​​без инициализатора (8.5) .

Однако недопустимо читать неинициализированную переменную с помощью [dcl.init], и поэтому ваша программа ведет себя неопределенно во время выполнения, если вы вызываете f с аргументом меньше 10.

1
Kerrek SB 25 Янв 2015 в 14:30