uldemir писал(а):ну я примерно вдумался. вот почему ++state; корректно, а state=++state; нет?
Компилятор насторожили две записи в одну переменную в промежутке между точками следования, он и выдал предупреждение об UB (порядок записей неопределён). Тут две записи: в операторе ++ и в операторе =.
должно дать то же самое предупреждение, если дало с enum.
Хотя конкретно тут результат будет одинаковый, это в
i = i++; будут проблемы порядка записей.
Возможно, компилятор ворчит на то, что он при оптимизации оставил одну запись в переменную из двух имеющихся в выражении (кстати, при volatile state он обязан будет обе записи оставить — оно Вам нужен лишний код?). Возможно, просто обиделся на наличие двух записей и не стал даже анализировать корректность результата.
А кто не даёт написать
Код: Выделить всё
state = (state == res_sec) ? show_clock : state + 1;
и избавиться от предупреждения?
(в С, так как в С++ тут таки будет
ошибка несовпадения типов, нужно будет явно написать приведение
(states)(state+1) )
p.s.
(тут был неправильный p.s., правильный был бы с постинкрементом, но он тяжело читается и не нужен такой)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.