Компилятор сократил x/x — и оказался «прав». Урок математики, который преподал gcc
Казалось бы, деление на ноль в С++ обязано ронять программу. Ждём аппаратное исключение и идём искать баг. Но базовые аксиомы иногда дают сбой.
Если скомпилировать в gcc вывод выражения x/x при нулевом вводе, краша не случится. Софт тихо вернёт единицу. Причина — константная свёртка. Опираясь на Undefined Behavior, компилятор считает нулевой сценарий невозможным и сокращает переменные по правилам школьной алгебры. При этом MSVC в аналогичной ситуации честно генерирует ошибку.
Выясним, как спецификация стандарта ломает математику.
Обсуждение 3
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram