Это здесь использует две вещи, во-первых, он использует побитовое и оператор &
это принимает бинарное представление двух целых чисел (i
и 4
) и вычисляет побитовое И обоих из них (т. е. для каждой позиции в результирующем двоичном представлении числа мы смотрим на биты в соответствующей позиции в двух аргументах и устанавливаем результирующий бит в 1
тогда и только тогда, когда оба бита в аргументы 1
), во-вторых, используется неявное преобразование int
в bool
, которое возвращает true
, если целое число не равно 0
.
Например, если мы имеем i=7
, то внутреннее побитовое представление об этом в виде дополнения до двух будет:
/*24 0s*/ 0 0 0 0 0 1 1 1
И дополняют представление этих двух по 4
является /*24 0s*/ 0 0 0 0 0 1 0 0
и поэтому побитовое И это /*24 0s*/ 0 0 0 0 0 1 0 0
и, как это не равно нулю, оно принудительно преобразуется в true
, и поэтому выполняется условие.
В качестве альтернативы, если мы рассмотрим i=2
, то есть внутреннее представление:
/*24 0s*/ 0 0 0 0 0 0 1 0
и, таким образом побитовое И дает /*24 0s*/ 0 0 0 0 0 0 0 0
и, таким образом, условие не выполняется.
Это побитовый оператор «и». http://en.wikipedia.org/wiki/Bitwise_operation Здесь не связан с оператором '?:' –
. С какими справочными документами C++ вы консультировались, и что это вам сказал? [Вот некоторые] (http://en.cppreference.com/). – Angew
Собственно, полный ответ был бы «это зависит от контекста». Он используется как унарный оператор, это «адрес». Как двоичный оператор, это действительно побитовое И. Кстати, оба результата были бы легко найдены, глядя на любую таблицу операторов в C++, найденную google. – Leeor