Это предупреждение, оно не относится к стандарту.
Предупреждения эвристические с «оптимистичным» подходом. Предупреждение выдается только тогда, когда компилятор уверен , что это будет проблемой. В подобных случаях вам больше повезло с clang
или новейшими версиями gcc
, как указано в комментариях (см. Еще один мой связанный вопрос: , почему я не получаю предупреждение "used неинициализированный" от gcc в этом тривиальном пример ).
в любом случае, в первом случае:
int i = i;
ничего не делает, поскольку i==i
уже. Возможно, что назначение полностью оптимизировано, поскольку оно бесполезно. С компиляторами, которые не «видят» самоинициализацию как проблему, вы можете сделать это без предупреждения:
int i = i;
printf("%d\n",i);
Принимая во внимание, что это вызывает предупреждение все в порядке:
int i;
printf("%d\n",i);
Тем не менее, это достаточно плохо, чтобы не предупреждать об этом, поскольку с этого момента i
считается инициализированным .
Во втором случае:
int i = i + 1;
Необходимо выполнить вычисление между неинициализированным значением и 1
. Там происходит неопределенное поведение.