Оператор – это символ, который предписывает компилятору выполнить определенные математические или логические манипуляции. В языке D большое количество встроенных операторов, и их можно разделить на следующие типы:
В этой главе по очереди описываются арифметические, сравнивающие, логические, побитовые, присваивающие и другие операторы.
В следующей таблице показаны все арифметические операторы, поддерживаемые языком D. Предположим, что в переменной A содержится 10, а в переменной B – 20, тогда:
Оператор | Описание | Пример |
---|---|---|
+ | Складывает два операнда. | A + B даст 30 |
- | Вычитает второй операнд из первого. | A - B даст -10 |
* | Перемножает два операнда. | A * B даст 200 |
/ | Делит числитель на знаменатель. | B / A даст 2 |
% | Возвращает остаток от целочисленного деления. | B % A даст 0 |
++ | Оператор приращения увеличивает целое значение на единицу. | A++ даст 11 |
-- | Оператор декремента уменьшает целое значение на единицу. | A-- даст 9 |
В следующей таблице показаны все операторы сравнения, поддерживаемые языком D. Предположим, что в переменной A содержится 10, а в переменной B – 20, тогда:
Оператор | Описание | Пример |
---|---|---|
== | Проверяет, равны ли значения двух операндов или нет, если да, то условие становится истинным. | (A == B) – false. |
!= | Проверяет, равны ли значения двух операндов или нет, если значения не равны, тогда условие становится истинным. | (A != B) – true. |
> | Проверяет, что значение левого операнда больше значения правого операнда, если да, тогда условие становится истинным. | (A > B) – false. |
< | Проверяет, что значение левого операнда меньше значения правого операнда, если да, тогда условие становится истинным. | (A < B) – true. |
>= | Проверяет, что значение левого операнда больше или равно значению правого операнда, если да, тогда условие становится истинным. | (A >= B) – false. |
<= | Проверяет, что значение левого операнда меньше или равно значению правого операнда, если да, тогда условие становится истинным. | (A <= B) – true. |
В следующей таблице показаны все логические операторы, поддерживаемые языком D. Предположим, что в переменной A содержится 1, а в переменной B – 0, тогда:
Оператор | Описание | Пример |
---|---|---|
&& | Называется логическим оператором И. Если оба операнда отличны от нуля, тогда условие становится истинным. | (A && B) – false. |
|| | Называется логическим оператором ИЛИ. Если любой из двух операндов отличен от нуля, тогда условие становится истинным. | (A || B) – true. |
! | Называется оператором логического отрицания NOT. Используется для изменения логического состояния операнда. Если условие истинно, тогда логический оператор NOT сделает результат ложным. | !(A && B) – true. |
Побитовые операторы работают с битами и выполняют операции с отдельными двоичными разрядами. Таблицы истинности для операторов &, |, и ^ выглядят так:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
Предположим, что A = 60; И B = 13. В двоичном формате они будут выглядеть следующим образом:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
Побитовые операторы, поддерживаемые языком D, перечислены в следующей таблице. Предположим, что переменная A содержит значение 60, а переменная B равна 13, тогда:
Оператор | Описание | Пример |
---|---|---|
& | Бинарный оператор И копирует бит в результат, если он существует в обоих операндах. | (A & B) даст 12, или двоичное 0000 1100. |
| | Бинарный оператор ИЛИ копирует бит, если он существует в любом из операндов. | (A | B) даст 61, или двоичное 0011 1101. |
^ | Бинарный оператор Исключающее ИЛИ копирует бит, если он установлен в одном из операндов, но не в обоих. | (A ^ B) даст 49, или двоичное 0011 0001 |
~ | Оператор Дополнения является унарным и имеет эффект «переворачивания» бит. | (~A ) даст -61, или двоичное 1100 0011 в форме дополнения двойки. |
<< | Бинарный оператор Сдвига влево. Значение левого операнда перемещается влево на количество бит, заданное правым операндом. | A << 2 даст 240, или двоичное 1111 0000 |
>> | Бинарный оператор Сдвига вправо. Значение левого операнда перемещается вправо на количество бит, заданное правым операндом. | A >> 2 даст 15, или двоичное 0000 1111. |
Следующие операторы присваивания поддерживаются в языке D:
Оператор | Описание | Пример |
---|---|---|
= | Это простой оператор присваивания. Он присваивает значения из правых операндов в левый операнд. | C = A + B присвоит значение суммы A + B в C |
+= | Это оператор сложения И присвоения. Он складывает правый операнд с левым операндом и присваивает результат левому операнду. | C += A эквивалетно C = C + A |
-= | Это оператор вычитания И присвоения. Он вычитает правый операнд из левого операнда и присваивает результат левому операнду. | C -= A эквивалетно C = C - A |
*= | Это оператор умножения И присвоения. Он умножает правый операнд на левый операнд и присваивает результат левому операнду. | C *= A эквивалетно C = C * A |
/= | Это оператор деления И присвоения. Он делит левый операнд на правый операнд и присваивает результат левому операнду. | C /= A эквивалетно C = C / A |
%= | Это оператор получения остатка от деления И присвоения. Он получает остаток от деления левого операнда на правый операнд и присваивает результат левому операнду. | C %= A эквивалетно C = C % A |
<<= | Это оператор сдвига влево И присвоения. | C <<= 2 тоже самое, что и C = C << 2 |
>>= | Это оператор сдвига вправо И присвоения. | C >>= 2 тоже самое, что и C = C >> 2 |
&= | Это оператор бинарного И с последующим присвоением. | C &= 2 тоже самое, что и C = C & 2 |
^= | Это оператор бинарного Исключающего ИЛИ с последующим присвоением. | C ^= 2 тоже самое, что и C = C ^ 2 |
|= | Это оператор бинарного ИЛИ с последующим присвоением. | C |= 2 тоже самое, что и C = C | 2 |
В языке D существует ещё несколько важных операторов, включая sizeof и ? :
Оператор | Описание | Пример |
---|---|---|
sizeof() | Возвращает размер памяти, занимаемый переменной. | sizeof(a), где a - целое число типа int, возвращает 4. |
& | Возвращает адрес переменной. | &a; даст фактический адрес переменной a. |
* | Указатель на переменную. | *a; даст указатель на переменную. |
? : | Условное выражение | Если условие истинно, тогда значение X: иначе значение Y. |
Приоритет оператора определяет группирование термов в выражении. Это влияет на вычисление выражения. Некоторые операторы имеют приоритет над другими.
Например, оператор умножения имеет более высокий приоритет, чем оператор сложения.
Рассмотрим выражение
x = 7 + 3 * 2.
Здесь в x присваивается 13, а не 20. Просто дело в том, что оператор * имеет более высокий приоритет, чем +, поэтому сначала вычисляется 3 * 2, а затем результат прибавляется к 7.
В этой таблице операторы с наивысшим приоритетом показаны в верхней части, а с наименьшим – внизу. Внутри выражения сначала вычисляются операторы с более высоким приоритетом.
Категория | Оператор | Ассоциативность |
---|---|---|
Суффикс | () [] -> . ++ - - | Слева направо |
Унарные | + - ! ~ ++ - - (type)* & sizeof | Справа налево |
Умножение/деление | * / % | Слева направо |
Сложение/вычитание | + - | Слева направо |
Сдвиг | << >> | Слева направо |
Логические | < <= > >= | Слева направо |
Равенство | == != | Слева направо |
Побитовое И | & | Слева направо |
Побитовое Исключающее ИЛИ | ^ | Слева направо |
Побитовое ИЛИ | | | Слева направо |
Логическое И | && | Слева направо |
Логическое ИЛИ | || | Слева направо |
Условное | ?: | Справа налево |
Присвоение | = += -= *= /= %=>>= <<= &= ^= |= | Справа налево |
Запятая | , | Слева направо |