Еслибы цикл изначально работалбы, то конечно х обнулилбы после 5, но процесс изначально не стал работать! Если x не равно 0 а равно другому значению до 6. то в цикл входит, расчёт переменной d ведётся. Но опятьже один проход. и переменная х по листингу не изменяется т,е, до строчки х=х+1; не доходит.
Да какая разница -- ни одна из указанных переменных никому вообще не нужна. Компилятору плевать. будет ли кто-то смотреть дизасм или в отладчике крутиить. Он не видит эффекта от кода -- выбрасывает и имеет полное право. Добавьте где-то в цикле PORTB = d;, чтобы он понял, что вычисления хоть кому-то нужны, и посмотрите опять.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Кстати, компилятору-то рукоплещу. Он выбросил код, меняющий глобальные переменные, на основании трёх фактов:
1. В рамках цикла факт изменения переменной ни на что не влияет.
2. Цикл вечный, то есть не по прерываниям больше ничего в программе выполняться не будет.
3. Глобальная переменная -- не volatile, то есть скрытым образом (сиречь в прерывании) изменяться и использоваться не может.
Вообще должен сказать, что avr-gcc в плане оптимизации меня в целом скорее радует. Иногда, конечно, загнёт что-то странное, но в среднем выходит достойно.
Да окозалось намного сложнее! Если что-то нигде не используется, то и компилятор это выкидывает "нафиг" - как и было сказанно. Умно устроенно. Добавил PORTB и всё заработало как надо! Спасибо! Единственно почемуто иногда окно "Watch" где можно наблюдать за изменениями значений переменных не работает. Само окно с переменными выходит но изменений в значениях переменных не наблюдается.
с локальными переменными в отладчике студии непросто: если они регистровые, а скорее всего, так оно и есть, отладчик не может их показать... если вы сделаете переменные глобальными, да еще и static (или лучше volatile) - вы сможете видеть их содержимое в окне Watch
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Да окозалось намного сложнее! Если что-то нигде не используется, то и компилятор это выкидывает "нафиг" - как и было сказанно. Умно устроенно.
Если программировать "по большому" - это нормальное явление. Там и не такие фишки выползают. Поэтому и считаю, что если писать для МК на ЯВУ, то надо досконально знать особенности используемого компилятора...
А разве я не объявил переменную - глобальной (до функции). Я считал, что если переменная объявляется до какой нибудь функции, то внутри функции переменная считается глобальной. Или есть разница в том что, объявил до функции, а присвоил значение внутри функции, и после присвоения значения, переменная считается уже локальной.
когда у вас кроме main нет никаких функций, компилятор в целях оптимизации не делает разницы между локальными и глобальными переменными - ее ведь и нет, не так ли? локальные-то прячутся от сторонних функций. а когда их нет - от кого прятаться? зато локальные лучше оптимизируются... вот у вас и выходят чудеса в решете
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Спасибо! Буду это иметь ввиду!
Ну а всётаки для укрепления знаний - если есть другие функции, то как это работает "нижеописанное" Что будет считаться приоритетным? " что глобальное и что локальное"
Или есть разница в том что, объявил до функции, а присвоил значение внутри функции, и после присвоения значения, переменная считается уже локальной.