не только.
a = b;
a = c;
это не кривой код, но без явного указания что с этим делать оптимизатор испортит логику.
Вообще-то, есть ещё такое понятие как время. В одно время мне нужно, чтоб а равнялось б, а в другое время, чтоб с, даже если это время равно одному такту. Неважно, зачем. Это может быть что-то параллельное: что-то где-то рядом читает a. Может быть требованием какой-либо периферии, например получение доступа к флэш у STM.тот код соответствует коду:
a = c
и компилятор его нормально скомпилит.
Что такое "испортит логику" - не понимаю. Логика тут простая - "а присвоить с", какая же ещё?
Сдаюсь. Тратить время на поиски глюков оптимизатора не хочу. Когда попадётся очередной, если не забуду - покажу Вам персонально. Новый и используемый всеми компилятор безгрешен. Логика его безупречна. В любом ином случае - кривой код или компилятор старый и никем не используется...Только скоростью. Как уже выше сказали. Если не только скоростью - код кривой.
Или приведите реальный пример такого кода, работа которого будет отличаться в зависимости от оптимизации (на нормальном компиляторе, а не некоем почти никем не используемым и давно заброшенным).
Код: Выделить всё
enum {b, c};
int a;
Это я написал. Поставить сюда ржущий смайлик, что ли...Использование float чревато лишь из-за способа представления данных, в результате которого в отсутствие чёткого понимания механизма, может быть, например, неверное сравнение в условии.
Понятно. Но я уже говорил - спорить не буду. Не видите очевидного, сами себе противоречите (volatile - то же опция) - Ваше счастие. Да и куда мне, неумехе-то, у которого инструмент виноват. У меня даже понимание термина "алгоритм" другое. Неверное.А "опции отключающие" - придумали главным образом - для возможности отладки с привязкой к исходному коду.
Код: Выделить всё
static char const t[] = "0\0" "1\0" "2\0" "3\0" "4\0" "5\0" "6\0" "7\0" "8\0" "9";
for (char const *s = &t[0]; atoi(s) < 9; s += strlen(s) + 1) {
... //в теле цикла s не используется, только для счётчика цикла!!
}Код: Выделить всё
struct B
{
operator int(){__enable_irq(); return 0;}
};
struct C
{
operator int(){__disable_irq(); return 1;}
};
int main()
{
int a;
B b;
C c;
a=b;
// CPSIE I
a=c;
// CPSID I
}