у вас есть новая версия GCC. Мой старше. Когда вы говорите «вероятный источник неопределенного поведения (если значение переменной используется позже)», это то же самое, что и использование его неинициализированным.
о сейчас я заметил, что следующий код можно скомпилировать с помощью clang / gcc / clang ++ / g ++, используяc99
, c11
, c++11
стандарты.
int main(void) {
int i = i;
}
и даже с-Wall -Wextra
Ни один из компиляторов даже не сообщает о предупреждениях.
Изменив код наint i = i + 1;
и с-Wall
они могут сообщить:
why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
int i = i + 1;
~ ^
1 warning generated.
Мои вопросы:
Почему это даже разрешено компиляторами?Что об этом говорят стандарты C / C ++? В частности, каково поведение этого? UB или зависит от реализации?