Интересную задачку нашел, кто обьяснит?

Вот такой код

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 - эффект пропадает.

Но как? - механизм мне непонятен

undefined behavior во всей красе.

1 лайк

А если в строке 18 присвоить “у” что то отличное от 1 , сохранится тенденция ?

надо в ассемблер вывести и посмотреть, что происходит

Почему , кстати, в первых двух случаях 0 ?
Там же мусор должен быть?

Проверил.
На телефоне нет такого эффекта.
Screenshot_2022-11-25-06-59-03-70_008959c34549ce671eb1dd94cfad7b1a

Была у меня такая загадка лет пять назад - в переменную лезло значение из условия, которое не выполнялось.

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

Типа вам все равно, мне и подавно, но, может, угадаю, чего хотели.

1 лайк

На старом форуме была такая тема.
Там, кажется, было примерно следующее: если условие выполнялось - возвращалось значение 8, а если не выполнялось - возвращалось неопределенное значение. Оптимизатор решил, что нужно всегда возвращать 8, не проверяя никаких условий. Так короче и ничему не противоречит (т.е. зачем что-то проверять, если можно обойтись без проверок).

Это мой вопрос и был: Инициализация переменных | Аппаратная платформа Arduino

а на нано есть

Знаете, тема напомнила известное

стихотворение Владимира Кострова

Один графоман
в солидный журнал
прислал корявый стишок.
Совсем таланта не было в нем,
и стиль был весьма смешон.
Но чтобы вывод под стих подвесть,
в нем были такие слова:
«Жизнь такова, какова она есть,
и больше — никакова!»

Младший редактор сказал: «Пустяки!
Ступай–ка в корзину, брат!»
Но чем–то тронули сердце стихи,
и он их вернул назад.
— Вчера я пришел веселенький весь,
и жена была не права.
Но «жизнь такова, какова она есть,
и больше — никакова!».

Редактор отдела, увидев стих,
наморщил высокий лоб:
— Стихи банальные. Автор псих.
А младший редактор жлоб.
Но строчки вошли, как благая весть,
до самого естества.
«Жизнь такова, какова она есть,
и больше — никакова!»

И, свой кабинет озирая весь,
подумал любимец богов:
«А может, и я таков, как есть,
и больше совсем никаков?»
И страшная мысль, как роса с травы,
скатилась с его головы:
«А может, и все, каковы они есть
и больше — никаковы?»

2 лайка

С железками такие ситуации бывали. Техники, типа:

  • А пачиму, если у меня тут не подключено работает так, а на другой плате, если не подключено, работает иначе?
  • Блин, ну ты сделай как нужно, а потом сравнивай.

Гадания на кофейной гуще, в общем.)

Вот поддержу.
Нахера херню нахерачивать?

Захерачивайте нахер!!!

1 лайк