int x = 6;
void setup() {
Serial.begin(9600);
delay(500);
}
void loop() {
int y ; // <------------
prt('A', x, y); // A 6 0
if (x > 3) {
prt('B', x, y); // B 6 0
}
else {
prt('C', x, y); // nothing printed here
if (1) y = 1; // how can y become 1 here ?
prt('D', x, y); // nothing printed here
}
prt('E', x, y); // E 6 1 (y not expected)
while (1);
}
void prt(char i, int x, int y) {
Serial.print(i);
Serial.print("\t");
Serial.print(x);
Serial.print("\t");
Serial.println(y);
}
печатает
A 6 0
B 6 0
E 6 1
Каким образом y становится 1, если строчка 18 находится внутри else. которое не исполняется?
Понятно, что это как-то связано с тем, что значение y не инициализировано. И точно - стоит добавить инициализацию в строку 9 - эффект пропадает.
Была у меня такая загадка лет пять назад - в переменную лезло значение из условия, которое не выполнялось.
Если пользователю все равно, какое значение переменной должно быть, то компилятор выбирает удобное для себя.
Видимо, в процессе оптимизации считает, что пора в тот регистр сунуть цифирь, которая где-то там проявляется хотя бы раз.
Типа вам все равно, мне и подавно, но, может, угадаю, чего хотели.
На старом форуме была такая тема.
Там, кажется, было примерно следующее: если условие выполнялось - возвращалось значение 8, а если не выполнялось - возвращалось неопределенное значение. Оптимизатор решил, что нужно всегда возвращать 8, не проверяя никаких условий. Так короче и ничему не противоречит (т.е. зачем что-то проверять, если можно обойтись без проверок).
Один графоман в солидный журнал прислал корявый стишок. Совсем таланта не было в нем, и стиль был весьма смешон. Но чтобы вывод под стих подвесть, в нем были такие слова: «Жизнь такова, какова она есть, и больше — никакова!»
Младший редактор сказал: «Пустяки! Ступай–ка в корзину, брат!» Но чем–то тронули сердце стихи, и он их вернул назад. — Вчера я пришел веселенький весь, и жена была не права. Но «жизнь такова, какова она есть, и больше — никакова!».
Редактор отдела, увидев стих, наморщил высокий лоб: — Стихи банальные. Автор псих. А младший редактор жлоб. Но строчки вошли, как благая весть, до самого естества. «Жизнь такова, какова она есть, и больше — никакова!»
И, свой кабинет озирая весь, подумал любимец богов: «А может, и я таков, как есть, и больше совсем никаков?» И страшная мысль, как роса с травы, скатилась с его головы: «А может, и все, каковы они есть и больше — никаковы?»