Стандарт гарантирует, что false
преобразуется в ноль, а true
преобразуется в единицу как целые числа:
4.7 Интегральные преобразования
...
Если тип назначения - bool, см. 4.12.Если тип источника - bool, значение false преобразуется в ноль, а значение true преобразуется в единицу.
Таким образом, эффект в приведенном вами примере гарантированно будет таким же и равен 100%.portable.
В приведенном вами случае любой порядочный компилятор может генерировать идентичный (оптимальный) код.
Однако для логических выражений expr1
и expr2
это не такв общем случае expr1 && expr2
совпадает с expr1 & expr2
, поскольку &&
выполняет оценку "короткого замыкания".То есть, если expr1
оценивается как false
, expr2
даже не будет оцениваться.Это может повлиять на производительность (если expr2
сложно) и поведение (если expr2
имеет побочные эффекты).(Но учтите, что форма &
на самом деле может быть быстрее, если она избегает условного перехода ... Играть с подобными вещами из соображений производительности почти всегда плохая идея.)
Итак, для конкретногоПример, который вы приводите, когда вы загружаете значения в локальные переменные, а затем воздействуете на них, поведение идентично, и производительность, скорее всего, будет.
По моему мнению, если вы специально не полагаетесь на "короткий«Схема» поведения, вы должны выбрать формулировку, которая наиболее четко выражает ваше намерение.Поэтому используйте &&
для логического И и &
для битового перемешивания И, и любой опытный программист на C ++ найдет ваш код легким для понимания.