18 Ноя в 10:11
6 +1
0
Ответы
1
Кратко: выражение int i=0; i=i+++++i \text{int } i = 0; \; i = i++ + ++i int i=0;i=i+++++i в C даёт undefined behavior. Объяснение и варианты исправления — ниже.
Почему UB:
- Оба выражения i++i++i++ (постинкремент) и ++i++i++i (преинкремент) изменяют одно и то же объект iii. В стандарте C говорится, что если побочный эффект (изменение) на скалярном объекте не упорядочен (unsequenced) относительно другого побочного эффекта или значения того же объекта, поведение неопределено.
- В выражении i=i+++++ii = i++ + ++ii=i+++++i побочные эффекты инкрементов и запись присваивания не упорядочены однозначно внутри одной полной подвыражения, то есть модификация iii происходит более одного раза без определённого порядка — следовательно, UB.
Последствия:
- Компиляторы могут оценивать операнды сложения в разном порядке; возможны разные результаты (например, 1 \,1\,1 или 2 \,2\,2), или неожиданные значения/ошибки — никакой результат не гарантирован.
Как сделать корректно:
- Разделить операции в разные выражения (сознавая, что между ними есть последовательность):
int i=0;\text{int } i = 0;int i=0; int a=i++;\text{int } a = i++;int a=i++; int b=++i;\text{int } b = ++i;int b=++i; i=a+b;\;i = a + b;i=a+b; - Или явно задать нужный порядок:
int i=0;\text{int } i = 0;int i=0; int old=i;\text{int } old = i;int old=i; ++i;++i;++i; i=old+i;i = old + i;i=old+i;
Вывод: никогда не модифицируйте одну и ту же переменную более одного раза в рамках одного выражения, если порядок этих модификаций не явно указан — это ведёт к undefined behavior.
18 Ноя в 10:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир