С имеет множество встроенных операторов. Оператор – это символ, который сообщает компилятору о необходимости выполнения некоторых математических или логических действий. Имеется три больших класса операторов: арифметические, отношения, логические и битовые. Кроме этого, С имеет несколько специальных операторов для частных задач.
Приоритет выполнения арифметических операций следующий:
Операторы, обладающие одним приоритетом, вычисляются компилятором слева направо. Круглые скобки в С устанавливают наивысший приоритет операций.
Ключевой концепцией операторов отношения и логических операторов является понятие истины и лжи. В С истине соответствует любое значение кроме 0, лжи – 0. Выражение, использующее операторы отношения или логические операторы, возвращает 0 для лжи и 1 для истины.
Операция
Значение
Пример
!
Логическое НЕ
!EOF
= =
Равно
value==0
!=
Не равно
value!=0
<
Меньше
i<count
>
Больше
i>count
> =
Больше или равно
i>=count
< =
Меньше или равно
i<=count
||
Логическое ИЛИ
!a || b
&&
Логическое И
a>8 && c<5
Таблица истинности для логических операторов образована с использованием на входах 1 и 0:
P
q
p&&q
p||q
!p
Как операторы отношения, так и логические операторы имеют более низкий приоритет по сравнению с арифметическими операторами. Это означает, что выражение 10 > 1 + 12 вычисляется как 10 > (1 + 12). Результатом будет ложь.
Ниже показаны приоритеты выполнения операторов отношения и логических операторов
высший !
> >= < <=
== !=
&&
низший ||
Как и в арифметических выражениях, возможно использование круглых скобок для изменения естественного порядка вычисления операторов отношения или логических операторов. Например:
!1 && 0
даст в результате 0, поскольку ! вычисляется первым, а затем вычисляется &&. Если расставить скобки следующим образом:
!(1 && 0)
то получится истина.
Надо помнить, что все выражения с операторами отношения и логическими операторами дают в результате 0 или 1. Поэтому следующий фрагмент программы не только корректен, но и печатает число 1:
int x;
x =100;
printf(“%d”, x > 1);
Битовые операторы
С поддерживает все существующие битовые операторы. Битовые операции – это считывание, установка или сдвиг битов в байте или слове, которые соответствуют стандартным типам языка С char и int. Битовые операции не могут использоваться с float, double, long double, void и другими сложными типами.
Оператор
Действие
&
И
|
ИЛИ
^
Исключающее ИЛИ
~
Дополнение
>>
Сдвиг вправо
<<
Сдвиг влево
Битовые операторы И, ИЛИ, НЕ используют ту же таблицу истинности, что и их логические эквиваленты, за тем исключением, что они работают побитно. Исключающее ИЛИ имеет следующую таблицу истинности:
p q p^q
0 0 0
0 1 1
1 0 1
1 1 0
Битовое И чаще всего используется для обнуления битов. То есть любой бит установленный в 0, вызывает установку соответствующего бита в другом операнде в также в 0. Например, следующая функция читает символы из порта модема, используя функцию read_modem(), и сбрасывает бит чётности в 0.
char get_char_from_modem(void)
{
char ch;
ch = read_modem();
return (ch & 127);
}
Чётность отображается старшим битом, который устанавливается в 0 с помощью битового И, поскольку 7 младших бит равны 1.
Оператор ?
С имеет очень мощный оператор, который можно использовать вместо if-else. Оператор ? имеет следующий вид:
выражение1 ? выражение2 : выражение3
Оператор ? работает следующим образом: вычисляется выражение1, если оно истинно, то вычисляется выражение2 и всё выражение получает это значение, если ложно, то вычисляется выражение 3 и всё выражение получает это значение. Например:
x = 10;
y = x>9 ? 100 : 200;
В данном примере y получает значение 100. Если бы х было меньше либо равно 9, то у получила бы значение 200.
Операторы указания & и *
Указатель – это адрес переменной в памяти. Указатель на переменную – это переменная, специально созданная для хранения указателя на объект определённого типа. Зная адрес переменной, можно существенно упростить работу некоторых программ. Указатели имеют три главных назначения в С:
1. Предоставляют быстрое обращение к элементам массива.
2. Позволяют функциям модифицировать передаваемые параметры.
3. Поддерживают динамические структуры данных.
Первый оператор - &. Это унарный оператор, возвращающий адрес операнда в памяти. Например:
m = &count;
помещает в m адрес переменной count.
Второй оператор – это *, дополняющая &. Это унарный оператор, возвращающий значение переменной по указанному адресу. Например:
q = *m;
Переменные, содержащие адреса или указатели, должны объявляться путём помещения * перед именем переменной. Например, для объявления указателя ch на символ, следует написать
char *ch;
Здесь ch - это не символ, а указатель на символ. Тип данных, на который указывает указатель, называется базовым типом указателя.
Ниже операторы * и & используются для занесения числа 10 в переменную target: