Читайте также: |
|
Минимальной единицей программного кода является оператор. Будучи одним из базовых понятий программирования, оператор не может быть определён строго. Интуитивное понимание оператора таково – это некие элементарные действия, из которых строятся более сложные. Операторы бывают одиночные и блочные. Одиночный оператор языка Си всегда заканчивается знаком;. Блочный оператор – это последовательность операторов, которая рассматривается как один. Блочный оператор заключается в фигурные скобки: {<операторы>}. Вот список наиболее употребляемых операторов языка Си:
Оператор | Значение | Пример |
<переменная1>=<переменная2> | Присваивание. В переменную1 записывается значение перменной2. Переменная1 при этом не изменяется. Работает со всеми типами данных. | a=b; |
!<переменная> | Логическое НЕ. Если переменная была равна 0, то!<переменная> имеет ненулевое значение (обычно 1). Иначе – ноль. Корректно работает с целочисленными данными. | a=!b; |
~<переменная> | Побитовое НЕ, дополнение до 1. Каждый бит переменной изменяется на противоположный. Логически это означает, что получается число, равное <максимальное значение данного типа>-<переменная>. Корректно работает с целочисленными данными. | a=~b: |
<переменная1>&&<переменная2> | Логическое И. Если обе переменные не равны 0, то имеет значение 1, в противном случае 0. Корректно работает с целочисленными данными. | a=b&&c; |
<переменная1>&<переменная2> | Побитовое И. Применяет логическую функцию И ко всем парам соответствующих бит. Корректно работает с целочисленными данными. | a=b&c; |
<переменная1>||<переменная2> | Логическое ИЛИ. Если хотя бы одна переменная не равно 0, то имеет значение 1, в противном случае 0. Корректно работает с целочисленными данными. | a=b||c; |
<переменная1>|<переменная2> | Побитовое ИЛИ. Применяет логическую функцию ИЛИ ко всем парам соответствующих бит. Корректно работает с целочисленными данными. | a=b|c; | |
<переменная1>^<переменная2> | Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ– Применяет логическую функцию ИСКЛЮЧАЮЩЕЕ ИЛИ ко всем соответствующим парам бит. Корректно работает с целочисленными данными. | a=b^c; | |
<переменная1><<<переменная2> | Арифметический[7] сдвиг вправо. Все биты числа сдвигаются вправо на количество позиций, равное переменной2. Правые биты заполняются нулями, если исходное число положительное, единицами – если отрицательное. Эта операция эквивалентна умножению на 2<переменнная2>[8]. Корректно работает с целочисленными данными. | a=a<<b; | |
<переменная1>>><переменная2> | Арифметический сдвиг влево. Все биты числа сдвигаются влево на количество позиций, равное переменной2. Левые биты заполняются нулями. Эта операция эквивалентна взятию целой части от деления на 2<переменнная2>. Корректно работает с целочисленными данными. | a=b>>c; | |
<переменная>++[9] | Инкремент – прибавление 1 к переменной. Корректно работает с целочисленными данными. | a++; | |
<переменная>-- | Декремент– вычитание 1 из переменной. Корректно работает с целочисленными данными. | b--; | |
<переменная1>+<переменная2> | Сложение– сумма переменной1 и переменной2. Работает со всеми типами данных. | c=a+b; | |
<переменная1>-<переменная2> | Вычитание– разность перменной1 и переменной2. Работает со всеми типами данных. | a=c-b; |
-<переменная> | Унарный минус– меняет знак переменной на противоположный Работает со всеми типами данных | a=-b; | |||
<переменная1>*<переменная2> | Умножение– результат перемножения перменной1 и переменной2. Работает со всеми типами данных. | a=b*c; | |||
<переменная1>%<переменная2> | Остаток- взятие остатка от деления переменной1 на перменную2. Корректно работает с целочисленными данными. | a=b%c; | |||
<переменная1>/<переменная2> | Деление– деление переменной1 на переменную2. Многие компиляторы определяют эту операцию для всех типов данных, но по стандарту она работает для чисел с плавающей точкой. | e=f/g; | |||
&<переменная> | Взятие адреса– &<переменная> имеет значение адреса, по которому расположена переменная. Работает со всеми типами данных. | p=&a; | |||
*<указатель> | Разадресация - *<указатель> имеет значение переменной, на которую ссылается указатель. Количество считываемых байт и их интерпретация зависят от типа указателя. Работает с указателями на любые типы. | a=*p; | |||
<переменная1>==<переменная2> | Равно– операция сравнения. Если переменная1 равна переменной2, то имеет значение 1, в противном случае 0. Работает с любыми типами данных. | a=b==c; | |||
<переменная1>!=<переменная2> | Не равно– операция сравнения. Если переменная1 равна переменной2, то имеет значение 0, в противном случае 1. Работает со всеми типами данных. | a=b!=c; | |||
<переменная1>><перменная2> | Больше – операция сравнения. Имеет значение 1, если переменная1 больше переменной2, в противном случае 0. Работает со всеми типами данных. | a=b>c; | |||
<переменная1>>=<перменная2> | Больше или равно – операция сравнения. Имеет значение 1, если переменная1 больше или равна переменной2, в противном случае 0. Работает со всеми типами данных. | a=b>=c; | |||
<переменная1><<перменная2> | Меньше – операция сравнения. Имеет значение 1, если переменная1 меньше переменной2, в противном случае 0. Работает со всеми типами данных. | a=b<c; | |||
<переменная1><=<перменная2> | Меньше или равно – операция сравнения. Имеет значение 1, если переменная1 меньше или равна переменной2, в противном случае 0. Работает со всеми типами данных. | a=b<=c; | |
<переменная1><бинарный оператор>=<переменная2> | Составное присваивание. Эквивалентно <переменная1>=<переменная1> <бинарный оператор><переменная2> | a+=3; то же, что и a=a+3; | |
<тип> <имя переменной>[=<значение>] [,<имя переменной2>[=<значение>]…] | Объявление переменной. Выделяет в памяти место под переменные, и связывает адреса с их именами. | int a=3, b;[10] | |
(<тип>)<переменная> | Преобразование типа – преобразует переменную к указанному типу. В конкретных случаях может означать, например, округление, изменение размера и так далее… | a=(float)b; |
Чаще всего приходится иметь дело с несколькими идущими подряд операторами. Даже такая вещь как a=b<c; – это два оператора: сравнение и присваивание. Интуитивно понятно, что мы хотим получить в a результат сравнения b и c, но не всегда вещи, понятные интуитивно, понятны компилятору (часто бывает, что и наоборот).
Для таких ситуаций существуют, во-первых, скобки. Круглые скобки в Си имеют тот же смысл, что и в математике: операторы, заключённые в большее количество скобок, выполняются раньше. Так становится очевидным смысл строки a=(((*b)+c)<d); – в переменную a кладётся результат сравнения суммы переменной, находящейся по адресу b, и переменной c с переменной d. Понятно, однако, что такая форма записи является неудобной и контринтуитивной. Поэтому существует такое понятие как приоритет операций.
Приоритет операций определяет порядок выполнения последовательно записанных операторов. Чем меньше приоритет операции, тем раньше она выполняется. Операции с одинаковым приоритетом выполняются слева направо. Скобки позволяют менять этот порядок. Ниже приведена краткая таблица приоритетов операций в Си:
Операции | Приоритет |
Префиксный инкремент и декремент | |
Унарный минус, преобразование типа, взятие адреса, разадресация, логическое НЕ, побитовое НЕ | |
Умножение, /, % | |
+, - | |
<<, >> | |
<, <=, >, >= | |
==,!= | |
Побитовое И | |
Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ | |
Побитовое ИЛИ | |
Логическое И | |
Логическое ИЛИ | |
Присваивание, составное присваивание | 14[11] |
Постфиксный инкремент и декремент |
Следует также отменить, что логические операторы выполняются ровно до того момента, как значение выражение не будет определено однозначно. Например, если в выражении a&b a имеет значение 0, то смотреть значение b не имеет смысла – выражение в любом случае равно 0. Это свойство позволяет создавать такие конструкции:
(b<10)&&(a=2)||(b>=10)&&(a=1);
Рассмотрим работу этой строки. Допустим, значение b меньше десяти. Тогда левая часть выражения (b<10)&&(a=2) будет равна 1, и чтобы определить его значение нужно узнать значение выражения a=2. Переменная a примет значение 2, а выражение a=2 – значение 2, поскольку присваивание имеет то же значение, которое было присвоено. Таким образом, левая часть выражения (b<10)&&(a=2)||(b>=10)&&(a=1),будет иметь значение 1. Это автоматически означает, что значение всего выражения равно 1, и считать дальше нет смысла. Поэтому второе присваивание выполнено не будет, значение a останется равным 2.
Если же b не меньше десяти, то выражение b<10 будет неверным, и дальнейшее вычисление выражения (b<10)&&(a=2) не имеет смысла. Но при этом левая часть выражения (b<10)&&(a=2)||(b>=10)&&(a=1) будет равно 0, а потому для определения его значения нужно посчитать значение (b>=10)&&(a=2). Левая часть этого выражения равна 1, и для определения значения нужно посчитать значение правой. Переменной a будет присвоено значение 1.
Дата добавления: 2015-11-13; просмотров: 42 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Часть 2: типы данных языка Си. | | | Часть 2: функции. |