Что за цирк с типом данных int?

Сериал то инициализируйте в сетапе…

Serial.begin(9600);

и не забудьте скорость монитора подстроить

а мне тоже интересно

Да, точно. Простите, никак не привыкну к необходимости инициализации. Исправил.

Гм… Да, какой-то бред получается…


Тогда код получается неправильно написан. Надо встраивать защиту от переполнения, а её нет. Получается ни система её не дала, ни я о ней не позаботился и не написал код. А компьютер туп как пробка - делает только то, что ему сказали.

Хотя погодите-ка… 500*1000=500000. Это должно укладываться в тип данных long - там ведь предел +2Г. Сейчас-то почему поведение системы не соответствует ожидаемому?

В-оооот! Вы начинаете понимать прелесть С.
Он делает РОВНО ТО ЧТО ВЫ НАПИСАЛИ в коде.
Не пытается подтирать вам сопли, как новомодные языки, а исполняет все в точности. Если написали “For” - значит так и хотели. И язык не будет исправлять это на for - он считает что вы сами знаете, что делаете.

чёт ты тут напридумывал, что за школа такая?

Почему не соответвует? для меня вполне… Я ж не зря вам тьакие примеры дал - знал что будет интересно.
500 * 1000 считается в типе инт, поэтому оно сначала переполняется, обрезается до инт - и только потом присваивается переменной в типе лонг.
Точно так же со вторым выражением, поэтому там ровно ноль, хотя вроде должно быть 0.5

1 лайк

Согласился бы, если бы не видел скромных попыток компилятора думать за меня. Ведь тут он думает:

А здесь не думает:


Кстати, в этом случае программа опять улетает в космос, выходя уже теперь за границы и long…

У компилятора для идиотов всегда есть long long на подхвате !!!

Потому, что Ваши ожидания не соответствуют реальности этого мира, то бишь, не адекватны ему.

Я, конечно, мог бы Вам объяснить в чём тут проблема. Но тут беда! Дело в том, что на моё прошлое объяснение (на которое я потратил пару часов времени, кстати) вместо “спасибо” я получил “это бред”. Тратить ещё время? Увольте, разбирайтесь сами.

2 лайка

Да, думаю пора закрывать тему.

Да, я тоже прошу её закрыть. Если вы считаете, что тема сама по себе вредная, то не буду возражать если вы её и удалите. Я не виноват в том, что мнение автора не совпало с мнением редакции. Так бывает.

не, если адекватный человек читает документацию, то таких проблем не бывает.

В последней попытке достучаться я “подниму ставки”.
В классической, Аристотелевой логике есть такой факт, что из ЛЖИ следует что угодно, в том числе ЛЮБАЯ ложь.
Например, если Луна сделана из сыра, то я - твой дедушка! Или даже бабушка, ОК?

Следствием это является факт того, что НЕПРАВИЛЬНЫЙ код имеет право делать всё что угодно! Вообще всё. Напечатать Псалтырь, нарисовать порно, взорвать компьютер.

Хоть так-то дойдёт? Надеюсь.

Так… Я открыл этот цирк, и я же его закрою. Я начал со ссылки на официальный учебник по Ардуино в части типа данных int. Официальным учебником же и закроем… Вместо тысячи слов достаточно было меня ткнуть вниз этой страницы, где черным по белому написано (цитата):
" Notes and Warnings

When signed variables are made to exceed their maximum or minimum capacity they overflow. The result of an overflow is unpredictable so this should be avoided. A typical symptom of an overflow is the variable “rolling over” from its maximum capacity to its minimum or vice versa, but this is not always the case. If you want this behavior, use unsigned int". Для наглядности и скриншот приложу:


Раз сами разработчики об этом заявили, значит это не баг, а фича, и под эту формулировку можно списать любые глюки системы. Всё официально. Что ж… Будем учитывать.

Тут вроде все согласны с тем, что компьютер туп как пробка. Он делает только то, что напишет ему в программе человек. Поэтому неправильный код имеет право делать все что угодно, но выражаться это будет только миганием светодиода на Ардуине, если программист, писавший обработчик события “неправильный код имеет право делать всё что угодно”, написал в этом обработчике включить и выключить светодиод. Так понятнее?

Опять неправильно помогаем. Сказали словами то же самое, а надо было “ткнуть” :frowning:

Ну, уж извините :frowning:


Я, вот, кстати, не понимаю, если язык С++ не нравится, почему не купить ардуину, позволяющую программировать на JavaScrit? Или на Питоне? Или поставить Бэйсик или Лисп? Или Форт? В конце концов и Брейнфак никто не отменял!

Может ТС выбрать для себя подходящий язык и прекратить, наконец, заниматься здесь брейнфакингом?

ТС, вот вариант должен лечь в Вашу концепцию миропонимания и С++

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  while(!Serial);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Start");
  for (long i=0;;i++){
    Serial.println((int)i);
  }
  Serial.println("End");
}

Или вот:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  while(!Serial);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Start");
  for (char i=0;;i++){
    Serial.println((int)i);
  }
  Serial.println("End");
}

Проверяю в Wokwi

Это парадокс :rofl:. Т.е. когда программист не указал условие выхода из цикла (внес неопределенность), то всё пучком - программа хоть и крутится в бесконечном цикле, но по крайней мере не вылетает за рамки границ минимального и максимального значений типа данных, и её поведение определено:

А когда ты указываешь условие выхода из цикла (т.е. с точки зрения программиста всё определено, все параметры заданы), то она тоже попадает в бесконечный цикл, но другого рода - вместо бесконечного цикла внутри границ своего типа данных она выходит за него и улетает в космос (возникает неопределённое поведение):

Наверное, произошло неявное преобразование long в unsigned long. И на это мне говорят что “это правильно, так и задумано” :grinning:.

Удивительно… Среди множества неверных дорог есть только одна правильная :grinning:.

Я согласен уже, что при неправильном задании условия из нормального цикла получается бесконечный цикл. Да, он бесконечный, но он хотя бы крутится в пределах границ своего типа данных. Объявил в цикле переменную такого-то типа - получишь бесконечный цикл в границах значений этого типа данных. С этим не спорю. Я уже спрашиваю “почему происходит неявное преобразование типа данных из одного в другой и выход за границы значений своего типа?” Может быть, я или из-за того что новичок или тупой, пропустил, где ранее уже давали ответ на этот вопрос. Ткните пожалуйста ещё раз в этот ответ.