
- •Предисловие.
- •1.1. Алфавит языка Си.
- •1.2. Идентификаторы.
- •1.3. Служебные (ключевые) слова.
- •1.4.Типы данных.
- •1.5. Константы.
- •1.5.1.Арифметические константы.
- •1.5.2. Вещественные константы.
- •1.5.3. Символьные и строковые константы.
- •1.6. Переменные.
- •1.7.Выражения.
- •1.8. Операции.
- •1.9. Приведение типов.
1.7.Выражения.
Во всех языках программирования под выражением подразумевается конструкция, составленная из констант, переменных, знаков операций, функций, скобок.
Арифметическое выражение определяет порядок вычисления некоторого значения.
Например:
31.2 + a * b;
14 * ( x * y - 2);
x++; Х+У; х++; а*5-(с*с.7); --А;
Опишем набор операций, используемых в языке, а также правила записи и вычисления выражений.
1.8. Операции.
Для формирования и последующего вычисления выражений используются операции. В языке насчитывается 15 операций. В таблице 1 перечислены все операции в соответствии с их рангом.
Таблица1
Приоритеты операций.
Ранг |
Операции |
Ассоциативность |
1. |
( ) [ ] |
→ → |
2. |
! ~ + − ++ −− & *(тип) sizeof |
← |
3. |
* / % мультипликативные бинарные |
→ |
4. |
+ − аддитивные бинарные |
→ |
5. |
<< >> поразрядного сдвига |
→ |
6. |
< <= > >= отношения |
→ |
7. |
== != отношения |
→ |
8. |
& поразрядное и |
→ |
9. |
^ поразрядное исключающее или |
→ |
10. |
| поразрядная дизъюнкция |
→ |
11. |
&& конъюнкция |
→ |
12. |
| | дизъюнкция |
→ |
13. |
?: условная операция |
← |
14 |
= *= /= %= += −= &= ^= |= <<= >>= |
← |
15. |
, операция запятая |
→ |
Напомним, что операция, применяемая к одному операнду, называется унарной, а операция с двумя операндами – бинарной.
Арифметические операции. К арифметическим операциям относятся:
- - вычитание или унарный минус;
+ - сложение или унарный плюс;
* - умножение;
/ - деление;
% - остаток от деления целых чисел (деление по модулю);
++ - унарная операция увеличения значения переменной на 1 (инкремент);
-- - унарная операция уменьшения значения переменной на 1 ( декремент);
Все операции, кроме деления по модулю, применимы к любым числовым данным. Операция % применима только к целым числам. Рассмотрим особенности выполнения операции деления в языке Си/Си++.
В том случае, когда делимое и делитель – целые числа, результат операции деления – целочисленное частное. Например:
15/5 - результат деления равен 3;
17/5 - в результате также получается целочисленное частное 3;
15%5 - остаток от деления равен 0;
5%15 - остаток от деления равен 5;
17%5 - остаток от деления равен 2;
Если хотя бы один из операндов имеет вещественный тип, то и результат операции вещественный. Например:
15/5.0 результат деления равен 3.0.
Операции инкремента и декремента.
Операции инкремента и декремента могут применяться только к переменным. Эти операции нельзя применять к константам и выражениям. Операция ++ увеличивает значение переменной на 1, операция -- уменьшает значение переменной на 1. Каждый из знаков операций может записываться как перед операндом (префиксная форма), так и после операнда (постфиксная форма).
Рассмотрим на примерах различие использования префиксной и постфиксной формы. Пример 1:
х = 4; у = 2;
z = x++ * y++;
В результате переменные получат следующие значения: х = 5, у = 3, z = 8, т.е. если используется постфиксная форма, то значения выражения вычисляется при «старых» значениях х и у, а затем изменяются значения х и у на 1.
Пример 2:
х = 4; у = 2;
z = ++х * ++у;
В результате переменные получат следующие значения: х = 5, у = 3, z = 15. При использовании префиксной формы значения переменных х и у изменяются до выполнения операции умножения. Приоритет арифметических операций и ассоциативность приведены в таблице 1. Тем не менее, запишем еще раз арифметические операции в порядке убывания старшинства:
++, --
*, /, %
+, -
Одинаковые по старшинству операции выполняются слева направо. Для изменения порядка выполнения операций могут использоваться круглые скобки.
Операции отношения:
Операция |
лексема |
Меньше |
< |
Больше |
> |
меньше либо равно |
<= |
больше либо равно |
>= |
Равно |
== |
Не равно |
!= |
В стандарте Си отсутствует логический тип данных. Поэтому результатом операции отношения является целое число: если результат операции отношения истина, то это число равно 1, в противном случае – 0.
Логические операции.
В языке Си/Си++ используется три логических операции:
! - операция отрицания (НЕ);
&& - операция умножения (конъюнкция, И);
|| - операция сложения (нестрогая дизъюнкция, ИЛИ).
Правила их выполнения определяются таблицами истинности.
НЕ
Операнд |
НЕ |
0 |
1 |
1 |
0 |
И
Операнд1 |
Операнд2 |
И |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
ИЛИ
Операнд1 |
Операнд2 |
ИЛИ |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
Например:
запишем логическое выражение: -3<х<3
в языке Си/Си++: х>-3 && х<3
Следует обратить внимание на то обстоятельство, что для записи выражения не понадобились круглые скобки. Объясняется это тем, что в языке Си/Си++ приоритет операции отношения выше, чем у логических операций умножения и сложения (см.таблицу1). По убыванию приоритета логические операции и операции отношения расположены в следующем порядке:
! (отрицание)
> < >= >= (операции отношения)
= = != (равно, не равно)
&& (конъюнкция)
|| (дизъюнкция)
Поразрядные логические операции.
Поразрядные логические операции определены только для целочисленных операндов и выполняются над соответствующими двоичными разрядами внутреннего представления операндов.
Знаки операций:
& - поразрядная конъюнкция;
| - поразрядная нестрогая дизъюнкция (ИЛИ);
^ - поразрядное исключающее ИЛИ (сложение по модулю 2);
~ - поразрядное отрицание.
Операции сдвига.
Операции сдвига определены только для целочисленных операндов.
Формат выражения операций сдвига:
Операнд1 операция Операнд2;
<< - сдвиг влево битового представления значения левого целочисленного операнда (Операнд1) на количество разрядов, равное значению правого целочисленного операнда (Операнд2).
>> - сдвиг вправо битового представления значения левого целочисленного операнда (Операнд1) на количество разрядов, равное значению правого целочисленного операнда (Операнд2).
Операция присваивания.
В качестве левого операнда в операции присваивания может использоваться только идентификатор переменной. Знак операции присваивания =. Присваивание, как любой другой знак операции может входить в выражение несколько раз. Например:
х = у = z + 3;
Операция присваивания правоассоциативна и имеет очень низкий приоритет (ранг равен 14). Различают простую операцию присваивания и составные операции, как уже отмечалось, знак простой операции присваивания =.
Рассмотрим составные операции присваивания на примерах, все эти операции перечислены в таблице 1.
a += 2 эквивалентно a = a +2;
c -= a эквивалентно c = c – a;
p / = n эквивалентно p = p/n;
n *= i эквивалентно n = n * i;
r %= 7 эквивалентно r = r % 7;
a <<= 4 эквивалентно a = a << 4;
a >>= 4 эквивалентно a = a >> 4;
a &= 14 эквивалентно a = a & 14;
a |= b эквивалентно a = a | b;
a ^= c эквивалентно a = a ^ c.
Операция sizeof.
Операция sizeof имеет две формы записи: sizeof (тип) и sizeof (выражение). Результатом операции является число, равное количеству байтов, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. Если посмотреть таблицу операций, то можно определить, что приоритет операции sizeof выше, чем приоритет бинарных арифметических операций, логических операций и отношений. Примеры:
sizeof (char) - результат 1 байт;
sizeof (14L) - результат 4 байта;
sizeof (14.2) - результат 8 байт.
Операция <запятая>.
Операция <запятая> используется для связывания нескольких выражений в одно. Несколько выражений, разделенных запятыми, вычисляются слева направо, в качестве результата сохраняются тип и значение самого правого выражения. Операция <запятая> группирует вычисления слева направо.
В дальнейшем рассмотрим использование этой операции. Также в дальнейшем будут рассмотрены остальные операции, перечисленные в таблице 1.