C Операторы

Оператор — это символ, который сообщает компилятору выполнить определённые математические или логические операции. В языке C есть богатый набор встроенных операторов, и он предоставляет следующие типы операторов:

  • Арифметические операторы
  • Операторы отношения
  • Логические операторы
  • Побитовые операторы
  • Операторы присваивания
  • Прочие операторы

В этой главе будут последовательно рассмотрены арифметические операторы, операторы отношения, логические операторы, побитовые операторы, операторы присваивания и другие операторы.

Арифметические операторы

В следующей таблице показаны все арифметические операторы, поддерживаемые языком C. Предположим, переменнаяAимеет значение 10, переменнаяBимеет значение 20, тогда:

ОператорыОписаниеПример
+Складывает два операнда.A + B даст 30
-Вычитает второй операнд из первого операнда.A - B даст -10
*Умножает два операнда.A * B даст 200
/Числитель, делённый на знаменательB / A даст 2
%Оператор взятия остатка, остаток после целочисленного деления.B % A даст 0
++Оператор инкремента увеличивает целочисленное значение на 1.A++ даст 11
--Оператор декремента уменьшает целочисленное значение на 1.A-- даст 9

Пример

См. следующий пример, чтобы изучить все доступные арифметические операторы в C:

Пример

#include <stdio.h> int main() { int a = 21; int b = 10; int c ; c = a + b; printf("Строка 1 - значение c равно %d\n", c ); c = a - b; printf("Строка 2 - значение c равно %d\n", c ); c = a * b; printf("Строка 3 - значение c равно %d\n", c ); c = a / b; printf("Строка 4 - значение c равно %d\n", c ); c = a % b; printf("Строка 5 - значение c равно %d\n", c ); c = a++; // инкремент после присваивания, c равно 21, a равно 22 printf("Строка 6 - значение c равно %d\n", c ); c = a--; // декремент после присваивания, c равно 22, a равно 21 printf("Строка 7 - значение c равно %d\n", c ); }

Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:

Line 1 - c 的值是 31
Line 2 - c 的值是 11
Line 3 - c 的值是 210
Line 4 - c 的值是 2
Line 5 - c 的值是 1
Line 6 - c 的值是 21
Line 7 - c 的值是 22

В следующем примере показана разница между a++ и ++a:

Пример

#include <stdio.h> int main() { int c; int a = 10; c = a++; printf("Присваивание перед операцией:\n"); printf("Строка 1 - значение c равно %d\n", c ); printf("Строка 2 - значение a равно %d\n", a ); a = 10; c = a--; printf("Строка 3 - значение c равно %d\n", c ); printf("Строка 4 - значение a равно %d\n", a ); printf("Операция перед присваиванием:\n"); a = 10; c = ++a; printf("Строка 5 - значение c равно %d\n", c ); printf("Строка 6 - значение a равно %d\n", a ); a = 10; c = --a; printf("Строка 7 - значение c равно %d\n", c ); printf("Строка 8 - значение a равно %d\n", a ); }

Вывод выполнения вышеуказанной программы:

先赋值后运算:
Line 1 - c 的值是 10
Line 2 - a 的值是 11
Line 3 - c 的值是 10
Line 4 - a 的值是 9
先运算后赋值:
Line 5 - c 的值是 11
Line 6 - a 的值是 11
Line 7 - c 的值是 9
Line 8 - a 的值是 9

Операторы отношения

В следующей таблице показаны все операторы отношения, поддерживаемые языком C. Предположим, переменнаяAимеет значение 10, переменнаяBимеет значение 20, тогда:

ОператорыОписаниеПример
==Проверяет, равны ли значения двух операндов. Если они равны, условие истинно.(A == B) ложно.
!=Проверяет, равны ли значения двух операндов. Если они не равны, условие истинно.(A != B) истинно.
>Проверяет, больше ли значение левого операнда, чем значение правого операнда. Если да, условие истинно.(A > B) ложно.
<Проверяет, меньше ли значение левого операнда, чем значение правого операнда. Если да, условие истинно.(A < B) истинно.
>=Проверяет, больше ли значение левого операнда или равно значению правого операнда. Если да, условие истинно.(A >= B) ложно.
<=Проверяет, меньше ли значение левого операнда или равно значению правого операнда. Если да, условие истинно.(A <= B) истинно.

Пример

См. следующий пример, чтобы изучить все доступные операторы отношения в C:

Пример

#include <stdio.h> int main() { int a = 21; int b = 10; int c ; if( a == b ) { printf("Строка 1 — a равно b\n" ); } else { printf("Строка 1 — a не равно b\n" ); } if ( a < b ) { printf("Строка 2 — a меньше b\n" ); } else { printf("Строка 2 — a не меньше b\n" ); } if ( a > b ) { printf("Строка 3 — a больше b\n" ); } else { printf("Строка 3 — a не больше b\n" ); } /*Измените значения a и b*/ a = 5; b = 20; if ( a <= b ) { printf("Строка 4 — a меньше или равно b\n" ); } if ( b >= a ) { printf("Строка 5 — b больше или равно a\n" ); } }

Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:

Line 1 - a 不等于 b
Line 2 - a 不小于 b
Line 3 - a 大于 b
Line 4 - a 小于或等于 b
Line 5 - b 大于或等于 a

Логические операторы

В следующей таблице показаны все операторы отношения и логические операторы, поддерживаемые языком C. Предположим, переменнаяAимеет значение 1, переменнаяBимеет значение 0, тогда:

ОператорыОписаниеПример
&&Называется логическим оператором AND. Если оба операнда не равны нулю, условие истинно.(A && B) ложно.
||Называется логическим оператором OR. Если хотя бы один из двух операндов не равен нулю, условие истинно.(A || B) истинно.
!Называется логическим оператором NOT. Он используется для инвертирования логического состояния операнда. Если условие истинно, логический оператор NOT сделает его ложным.!(A && B) истинно.

Пример

Смотрите следующий пример, чтобы изучить все доступные логические операторы в C:

Пример

#include <stdio.h> int main() { int a = 5; int b = 20; int c ; if ( a && b ) { printf("Строка 1 — условие истинно\n" ); } if ( a || b ) { printf("Строка 2 — условие истинно\n" ); } /*Измените значения a и b*/ a = 0; b = 10; if ( a && b ) { printf("Строка 3 — условие истинно\n" ); } else { printf("Строка 3 — условие ложно\n" ); } if ( !(a && b) ) { printf("Строка 4 — условие истинно\n" ); } }

Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:

Line 1 - 条件为真
Line 2 - 条件为真
Line 3 - 条件为假
Line 4 - 条件为真

Побитовые операторы

Побитовые операторы действуют на биты и выполняют операции бит за битом. Таблицы истинности &, | и ^ выглядят следующим образом:

pqp & qp | qp ^ q
00000
01011
11110
10011

Предположим, 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

В следующей таблице показаны побитовые операторы, поддерживаемые языком C. Предположим, переменнаяAимеет значение 60, переменнаяBимеет значение 13, тогда:

ОператорыОписаниеПример
&

Выполняет логическую операцию AND над каждым битом двух операндов. Если оба соответствующих бита равны 1, результат равен 1; в противном случае — 0.

Побитовая операция AND выполняет операцию "AND" над двоичными битами. Правила:

0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;
(A & B) даёт 12, что равно 0000 1100.
|

Выполняет логическую операцию OR над каждым битом двух операндов. Если оба соответствующих бита равны 0, результат равен 0; в противном случае — 1.

Побитовый оператор OR выполняет операцию «OR» над двоичными битами. Правила:

0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;
(A | B) даёт 61, что равно 0011 1101.
^

Выполняет логическую операцию XOR над каждым битом двух операндов. Если значения двух соответствующих битов одинаковы, результат равен 0; в противном случае он равен 1.

Оператор XOR выполняет операцию «XOR» над двоичными битами. Правила:

0^0=0;   
0^1=1;   
1^0=1;  
1^1=0;
(A ^ B) даёт 49, что равно 0011 0001.
~

Выполняет логическое отрицание каждого бита операнда, то есть заменяет каждый 0 на 1, а каждую 1 на 0.

Побитовый оператор NOT выполняет операцию «NOT» над двоичными битами. Правила:

~1=-2;   
~0=-1;
(~A ) даст -61, что представляет собой 1100 0011 — дополнительный код знакового двоичного числа.
<<

Сдвигает все биты операнда влево на указанное количество битов. Сдвиг влево на n битов эквивалентен умножению на 2 в степени n.

Оператор побитового сдвига влево. Сдвигает все двоичные биты операнда влево на определённое количество битов (крайние левые двоичные биты отбрасываются, а справа заполняются нулями).

A << 2 даёт 240, что равно 1111 0000.
>>

Сдвигает все биты операнда вправо на указанное количество битов. Сдвиг вправо на n битов эквивалентен делению на 2 в степени n.

Оператор побитового сдвига вправо. Сдвигает все двоичные биты числа вправо на определённое количество битов. Для положительных чисел слева заполняются нули; для отрицательных чисел слева заполняются единицы; крайние правые биты отбрасываются.

A >> 2 даёт 15, что равно 0000 1111.

Пример

Смотрите следующий пример, чтобы узнать все доступные побитовые операторы в C:

Пример

#include <stdio.h> int main() { unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ printf("Строка 1 - значение c равно %d\n", c ); c = a | b; /* 61 = 0011 1101 */ printf("Строка 2 - значение c равно %d\n", c ); c = a ^ b; /* 49 = 0011 0001 */ printf("Строка 3 - значение c равно %d\n", c ); c = ~a; /*-61 = 1100 0011 */ printf("Строка 4 - значение c равно %d\n", c ); c = a << 2; /* 240 = 1111 0000 */ printf("Строка 5 - значение c равно %d\n", c ); c = a >> 2; /* 15 = 0000 1111 */ printf("Строка 6 - значение c равно %d\n", c ); }

Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:

Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15

Операторы присваивания

В следующей таблице перечислены операторы присваивания, поддерживаемые языком C:

ОператорыОписаниеПример
=Оператор простого присваивания, присваивает значение правого операнда левому операнду.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

Пример

См. следующий пример, чтобы изучить все доступные операторы присваивания в C:

Пример

#include <stdio.h> int main() { int a = 21; int c ; c = a; printf("= пример оператора, значение c = %d\n", c ); c += a; printf("+= пример оператора, значение c = %d\n", c ); c -= a; printf("Пример оператора -=, значение c = %d\n", c ); c *= a; printf("Пример оператора *=, значение c = %d\n", c ); c /= a; printf("Пример оператора /=, значение c = %d\n", c ); c = 200; c %= a; printf("Пример оператора %%=, значение c = %d\n", c ); c <<= 2; printf("Пример оператора <<=, значение c = %d\n", c ); c >>= 2; printf("Пример оператора >>=, значение c = %d\n", c ); c &= 2; printf("Пример оператора &=, значение c = %d\n", c ); c ^= 2; printf("Пример оператора ^=, значение c = %d\n", c ); c |= 2; printf("Пример оператора |=, значение c = %d\n", c ); }

Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:

Line 1 - =  运算符实例,c 的值 = 21
Line 2 - += 运算符实例,c 的值 = 42
Line 3 - -= 运算符实例,c 的值 = 21
Line 4 - *= 运算符实例,c 的值 = 441
Line 5 - /= 运算符实例,c 的值 = 21
Line 6 - %= 运算符实例,c 的值 = 11
Line 7 - <<= 运算符实例,c 的值 = 44
Line 8 - >>= 运算符实例,c 的值 = 11
Line 9 - &= 运算符实例,c 的值 = 2
Line 10 - ^= 运算符实例,c 的值 = 0
Line 11 - |= 运算符实例,c 的值 = 2

Разные операторы ↦ sizeof & тернарный

В следующей таблице перечислены некоторые другие важные операторы, поддерживаемые языком C, включаяsizeofи? :。

ОператорыОписаниеПример
sizeof()Возвращает размер переменной.sizeof(a) вернёт 4, где a — целое число.
&Возвращает адрес переменной.&a; выдаст фактический адрес переменной.
*Указывает на переменную.*a; будет указывать на переменную.
? :Условное выражениеЕсли условие истинно ? то значение X : иначе значение Y

Пример

См. следующий пример, чтобы изучить все доступные прочие операторы в C:

Пример

#include <stdio.h> int main() { int a = 4; short b; double c; int* ptr; /*пример оператора sizeof*/ printf("Строка 1 - размер переменной a = %lu\n", sizeof(a) ); printf("Строка 2 — размер переменной b = %lu\n", sizeof(b) ); printf("Строка 3 — размер переменной c = %lu\n", sizeof(c) ); /*Пример операторов & и **/ ptr = &a; /*'ptr' теперь содержит адрес 'a'*/ printf("значение a равно %d\n", a); printf("*ptr равно %d\n", *ptr); /*пример тернарного оператора*/ a = 10; b = (a == 1) ? 20: 30; printf( "значение b равно %d\n", b ); b = (a == 10) ? 20: 30; printf( "значение b равно %d\n", b ); }

Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:

Line 1 - 变量 a 的大小 = 4
Line 2 - 变量 b 的大小 = 2
Line 3 - 变量 c 的大小 = 8
a 的值是 4
*ptr 是 4
b 的值是 30
b 的值是 20

Приоритет операторов в C

Приоритет операторов определяет группировку членов выражения. Это влияет на то, как вычисляется выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, операторы умножения и деления имеют более высокий приоритет, чем операторы сложения и вычитания.

Например, x = 7 + 3 * 2. Здесь x присваивается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому сначала вычисляется умножение 3*2, а затем прибавляется 7.

В следующей таблице операторы перечислены в порядке приоритета от высшего к низшему. Операторы с более высоким приоритетом расположены в верхней части таблицы, а операторы с более низким приоритетом — в нижней. В выражении сначала вычисляются операторы с более высоким приоритетом.

Категория ОператорыАссоциативность
Постфиксные() [] -> . ++ - -   Слева направо
Унарные + - ! ~ ++ - - (type)* & sizeof  Справа налево
Мультипликативные * / % Слева направо
Аддитивные+ -  Слева направо
Сдвиг << >>  Слева направо
Связь< <= > >=  Слева направо
Равенство == !=  Слева направо
Побитовое И&  Слева направо
Побитовое XOR ^  Слева направо
Побитовое ИЛИ |  Слева направо
Логическое И&&  Слева направо
Логическое ИЛИ ||  Слева направо
Условия?:  Справа налево
Присваивание = += -= *= /= %=>>= <<= &= ^= |= Справа налево
comma ,  Слева направо

Пример

См. следующий пример, чтобы понять приоритет операторов в C:

Пример

#include <stdio.h> int main() { int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * c / d; // ( 30 * 15 ) / 5 printf("значение (a + b) * c / d равно %d\n", e ); e = ((a + b) * c) / d; // (30 * 15 ) / 5 printf("значение ((a + b) * c) / d равно %d\n" , e ); e = (a + b) * (c / d); // (30) * (15/5) printf("значение (a + b) * (c / d) равно %d\n", e ); e = a + (b * c) / d; // 20 + (150/5) printf("значение a + (b * c) / d равно %d\n" , e ); return 0; }

Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:

(a + b) * c / d 的值是 90
((a + b) * c) / d 的值是 90
(a + b) * (c / d) 的值是 90
a + (b * c) / d 的值是 50
Другие расширения