С++ какие вредности можно получить от не инициализированных переменных?
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 шт):
Заметим, что компилятор на неинициализированные переменные реагирует предупреждением. Что означает примерно "ты хорошо подумал? Если хорошо - так тому и быть".
Вы хорошо подумали и пришли к выводу, что x^=x обнуляет переменную x. Значит, так тому и быть, и вы можете проигнорировать это предупреждение.
Только почему именно так, а не
for(int x = 0; x < y; ++x)
как обычно (еще и с ограничением видимости переменной-счетчика циклом)? Чем ваш способ лучше обычной инициализации? Кстати, умный компилятор оптимизирует его в обычное обнуление — см., например, тут.
Если же вопрос
какие вредности можно получить от не инициализированных переменных
то массу, просто массу! :)
Например, в том же цикле с неинициализированным счетчиком — сколько раз будет выполнено тело цикла?... Выделение памяти, когда размер задается неинициализированной переменной — сколько будет выделено?
Использование неинициализированной переменной есть UB, и может запутать оптимизатор.
Не надо углубляться в преждевременную микрооптимизацию. Если на вашей платформе выгодно занулять через xor, то компилятор сделает это сам.