С++ какие вредности можно получить от не инициализированных переменных?

C/C++ допускает использование неинициализированных переменных. Следующее выражение допустимо:

#include <iostream> 
int main(void){
   int x; // x is unintalized
   std::cout << x << std::endl; //correct, value is ...
   return 0; 
}

Я использую в своей программе подобный код, например, с пост-инициализацией:

void foo() {
  int x, y = 100, ...;
  for(x ^= x; x < y; ++x){
    ...
    // do something
    ...
  }
}

Как видите, используется выражение:

x ^= x

которое приводит к обнулению значения переменной.

Такой подход оптимален?

cppcheck на подобный пример ругается:

cppcheck: Uninitialized variable: x


Ответы (2 шт):

Автор решения: Harry

Заметим, что компилятор на неинициализированные переменные реагирует предупреждением. Что означает примерно "ты хорошо подумал? Если хорошо - так тому и быть".

Вы хорошо подумали и пришли к выводу, что x^=x обнуляет переменную x. Значит, так тому и быть, и вы можете проигнорировать это предупреждение.

Только почему именно так, а не

for(int x = 0; x < y; ++x)

как обычно (еще и с ограничением видимости переменной-счетчика циклом)? Чем ваш способ лучше обычной инициализации? Кстати, умный компилятор оптимизирует его в обычное обнуление — см., например, тут.

Если же вопрос

какие вредности можно получить от не инициализированных переменных

то массу, просто массу! :)

Например, в том же цикле с неинициализированным счетчиком — сколько раз будет выполнено тело цикла?... Выделение памяти, когда размер задается неинициализированной переменной — сколько будет выделено?

→ Ссылка
Автор решения: HolyBlackCat

Использование неинициализированной переменной есть UB, и может запутать оптимизатор.

Не надо углубляться в преждевременную микрооптимизацию. Если на вашей платформе выгодно занулять через xor, то компилятор сделает это сам.

→ Ссылка