Вернуться к статьям

Головоломка для C-разработчиков: чему равно a после a = a++ + ++a?

14 мая 2026
2 мин чтения
Головоломка для C-разработчиков: чему равно a после a = a++ + ++a?

Разбираем классический пример неопределённого поведения в C, от которого у компилятора глаза на лоб лезут.

Помните те моменты на собеседованиях, когда вас просят вычислить значение переменной после пары инкрементов? Если да, то вы либо проходили мимо этой задачи со смехом, либо до сих пор гадаете, что там насчитал компилятор.

В далёком 2011 году польский исследователь Gynvael Coldwind опубликовал пост с, казалось бы, детским примером: int a = 5; a = a++ + ++a;. И попросил угадать результат. Спойлер: стандарт языка C считает такое выражение неопределённым поведением (undefined behavior). То есть компилятор может сделать с этой строчкой всё что угодно — от форматирования жёсткого диска до отправки вашего кода в чёрную дыру.

Почему так? Потому что в одной точке последовательности (sequence point) переменная a изменяется более одного раза без разделяющего sequence point. a++ и ++a оба модифицируют a, и порядок вычисления не определён. Разные компиляторы, разные флаги оптимизации — разные ответы. Например, GCC с -O2 может выдать 12, а Clang — 11. А если повезёт, то и 42.

Мораль: не пишите такой код в продакшене, если не хотите, чтобы ваши коллеги проклинали вас на ежедневных стендапах. Используйте отдельные выражения и не полагайтесь на порядок вычислений. И да, всегда ставьте флаги предупреждений компилятора — -Wall -Wextra спасут вашу репутацию.

Комментарий студии METABYTE: У нас тоже бывают дни, когда код ведёт себя как этот пример — непредсказуемо. Но мы предпочитаем не гадать на компиляторе, а сразу писать чистый и понятный код. Хотя иногда хочется оставить пару таких головоломок для будущих стажёров...

C головоломка: a = a++ + ++a — неопределённое поведение | METABYTE — METABYTE