Проблема заключается здесь
"*$"[value % 2]
В C ++ результат оператора по модулю, примененный к отрицательному числу, отрицателен (ну, технически немного сложнее , чем это),Таким образом, когда value
отрицательно, эта инструкция вызывает неопределенное поведение, обращаясь к массиву (строковому литералу) за пределами (один с индексом -1 ).
Вы можете решитьпроблема с принятием абсолютного значения value
или результата, но вместо этого попробуйте написать бесплатную функцию, подобную приведенной ниже.
constexpr bool is_odd(int x)
{
return x % 2;
}
Это лучше выразит намерение и поможет компилятору оптимизировать ваш код(см., например, здесь ), потому что это как если бы вы спрашивали
Скажите, если value
делится на два (остаток от деления на2 - ноль) или не .
Что отличается от
Дайте мне остаток от деления value
на 2
На связанной странице компилятора вы, возможно, заметили, что компиляторы в конечном итоге используют простую
and edi, 1
вместо выполнения реальной операции по модулю. Это потому, что вам действительно нужен менее значимый бит, и вы можете напрямую использовать в своем коде
value & 1
Обратите внимание, однако, что Стандарт (C ++ 17, пока я пишу) не 't обязывает (пока C ++ 20 потребует дополнения до двух) конкретным двоичным представлением для типа int
, поэтому предыдущий будет определен реализацией (и будет неправильным, если вы обнаружите ’s 'дополнение ). все еще работает int
реализация).