2010-04-17 4 views
12

У меня есть следующий код, и я не могу понять, что это значит:Что означает «| =» в C++?

var1 |= var2>0 ? 1 : 2; 

Любой человек может помочь мне, пожалуйста!

+1

в CS, это называется «ком фунт ". –

+2

Вы должны прочитать на этом языке. – starblue

+0

FYI, это также выполнимо в Java, например, 'int var1, var2'. – polygenelubricants

ответ

12

Все операторы a op= b являются ярлыками от a = a op b.

Однако, поскольку C++ разрешает переопределять op и op=, вы полагаетесь на то, что каждый разработчик настраиваемых типов будет согласован.

+1

Я бы назвал зло любого, выполняющего разные задачи в '@' и '@ =': s –

+1

@Matthieu: C++ - это (и, ИМО, всегда будет) язык, который дает вам много веревки, с помощью которых можно повесить себя. – Richard

+0

Я не знаю никого, кто их применял, чтобы иметь другое поведение (за исключением того, что составное назначение, очевидно, изменяет его левый операнд). Но реализация одного без другого довольно распространена, например. операторы ввода iostreams. –

2

Оператор | = означает присвоение с помощью побитового ИЛИ оператора

4

Как уже сказал, что это сокращение v1 = v1 | v2; Другого использования вы можете встретить это с булевыми.
Дано:

bool b = /*some value*/ 

Вместо того чтобы сказать:

if(a) 
    b = true; 

вы можете увидеть:

b |= a; 
6

cond ? x : y возвращается x если конд верно и y иначе. Читать Ternary Operator

a |= b представляет собой сокращенную a = a | b который назначая a | b к a

a | b является bitwise OR из a и b. (например, 2 | 3 = 3 и 1 | 2 = 3)

+0

2 | 3 = 3, правильно? – Cowan

+0

@Cowan: спасибо и обновлены. –

3

Как и другие люди, которые передо мной упоминали, это означает, что вы получите назначение поразрядным ИЛИ.

Побитовое ИЛИ может быть проиллюстрировано с помощью левого и правого боковых узоров и поместить их поверх каждого другого.

В каждой колонке: 0 + 0 дает 0, 1 + 0 дает 1, 0 + 1 дает 1, 1 + 1 дает 1.
В контексте булевы: ложные или ложно == ложным, истинным или ложным == true, false ИЛИ true == true, true ИЛИ true == true.

Вот пример побитового OR и полученный битовый шаблон: var1 (11) | = var2 (14) -> var1 (15)

 
    1011 (11) 
OR 1110 (14) 
= 1111 (15) 
4

Целые может быть представлено в двоичной системе, так что каждая цифра (бит, переключатель) равен 1 (включено) или 0 (выключен):

00000000 == 0 
00000001 == 1 
00000010 == 2 
00000011 == 3 
00000100 == 4 
00001000 == 8 
00010000 == 16 

Побитовый иЛИ сочетает в себе два числа от "слияния" два набора бит:

First number:  00110000 
Second number: 00000010 
Result:   00110010 

Если бит равен 1 в EITHER номеров ввода, то в результате это будет 1.

Сравнение с побитового И, который находит «перекрывание» из двух наборов битов:

First number:  00110100 
Second number: 10011110 
Result:   00010100 

Если бит равен 1 в обоих входных чисел, то он будет 1 в результате.

Если числа в переменных а и Ь, вы можете поместить побитовый ИЛИ/И результаты в новый переменный с:

unsigned int c = a | b; // OR 

unsigned int c = a & b; // AND 

Часто результат должен быть помещен в одну из двух переменных , т.е.

unsigned int c = a | b; // OR 
c = a; // copy 

так как сокращение, вы можете сделать это в одном шаге:

a |= b; // merge b directly into a