Правила записи выражений в языках программирования

Обновлено: 22.12.2024

Во всех языках программирования под выражением подразумева­ется конструкция, составленная из констант, переменных, знаков операций, функций, скобок. Выражение определяет порядок вычис­ления некоторого значения. Если это числовое значение, то такое выражение называют арифметическим. Вот несколько примеров ариф­метических выражений, записанных по правилам языка Си:

х++ х+++ b - - n *2 n *=1

Три первых выражения имеют традиционную форму для язы­ков программирования высокого уровня, поэтому их смысл оче­виден. Следующие четыре выражения специфичны для языка Си.

Опишем набор операций, используемых в Си, а также правила записи и вычисления выражений. Напомним, что операция, при­меняемая к одному операнду, называется унарной, а операция с двумя операндами — бинарной.

Арифметические операции . К арифметическим операциям отно­сятся:

- вычитание или унарный минус;

+ сложение или унарный плюс;

% деление по модулю ;

++ унарная операция увеличения на единицу (инкремент);

- - унарная операция уменьшения на единицу (декремент).

Все операции, кроме деления по модулю, применимы к лю­бым числовым типам данных. Операция % применима только к целым числам.

Рассмотрим особенности выполнения операции деления. Если делимое и делитель — целые числа, то и результат — целое число. На­пример, значение выражения 5/3 будет равно 2, а при вычисле­нии 1/5 получится 0 .

Если хотя бы один из операндов имеет вещественный тип, то и ре­зультат будет вещественным. Например, операции 5./3, 5./3., 5/3. дадут вещественный результат 1.6666.

Операции инкремента и декремента могут применяться только к переменным и не могут — к константам и выражениям. Операция ++ увеличивает значение переменной на единицу, операция - - — умень­шает значение переменной на единицу. Оба знака операции могут записываться как перед операндом (префиксная форма), так и после операнда (постфиксная форма), например: ++х или х++, --а или а--. Три следующих оператора дают один и тот же ре­зультат:

Различие проявляется при использовании префиксной и пост­фиксной форм в выражениях. Проиллюстрируем это на примерах. Первый пример:

В результате выполнения переменные получат следующие зна­чения: а = 4, b = 3, с= 6. Второй пример:

Результаты будут такими: а = 4, b = 3, с=12.

Объяснение следующее: при использовании постфиксной формы операции ++ и - - выполняются после того, как значение перемен­ной было использовано в выражении, а префиксные операции — до использования. Поэтому в первом примере значение переменной с вычислялось как произведение 3 на 2, а во втором — как произве­дение 4 на 3.

По убыванию старшинства арифметические операции распо­ложены в следующем порядке:

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

Операции отношения . В Си используется тот же набор операций отношения .

<= меньше или равно,

>= больше или равно, равно,

Как уже говорилось раньше, в стандарте Си нет логического типа данных. Поэтому результатом операции отношения является целое число: если отношение истинно — то 1, если ложно — то 0.

Результатом второго и третьего отношений будет 0 — ложь; результат четвертого отношения равен 1 — истина; результат пер­вого отношения зависит от значения переменной а.

Логические операции . Три основные логические операции в языке Си:

! операция отрицания (НЕ),

&& конъюнкция, логическое умножение (И),

| | дизъюнкция, логическое сложение (ИЛИ).

Например, логическое выражение, соответствующее системе неравенств 0 < x < 1 в программе на Си запишется в виде следую­щего логического выражения:

Обратите внимание на то обстоятельство, что здесь не понадо­бились круглые скобки для выделения операций отношения. В Си операции отношения старше конъюнкции и дизъ­юнкции. По убыванию приоритета логические операции и опера­ции отношения расположены в следующем порядке:

Помимо рассмотренных в Си имеются поразрядные логические операции. Эти операции выполняются над каждой парой соответ­ствующих двоичных разрядов внутреннего представления операн­дов. Их еще называют битовыми логическими операциями. Знаки битовых логических операций:

& поразрядная конъюнкция (И),

| поразрядная дизъюнкция (ИЛИ),

^ поразрядное исключающее ИЛИ,

поразрядное отрицание (НЕ).

Битовые логические операции вместе с операциями поразряд­ного сдвига влево (<<) и вправо (>>) позволяют добраться до каждого бита внутреннего кода. Чаще всего такие действия прихо­дится выполнять в системных программах.

Операция присваивания. Знак операции присваивания =. Следствием отме­ченного факта является то, что присваивание, как любой другой знак операции, может несколько раз входить в выражение. На­пример:

Присваивание имеет самый низкий приоритет (ниже только у операции «запятая»). Кроме того, операция присваивания — правоассоциативная. Это значит, что несколько подряд расположен­ных присваиваний выполняются справа налево. Поэтому в приве­денном выше выражении первой выполнится операция сложе­ния, затем переменной с присвоится значение суммы, затем это значение присвоится переменной b и в конце — переменной а.

В языке Си имеются дополнительные операции присваивания, совмещающие присваивание с выполнением других операций. Среди них: +=, -=, /=, *=, %=. Приоритет у них такой же, как и у простого присваивания. Примеры использования этих операций:

а+=2 эквивалентно а=а+2,

х-=а+ b эквивалентно х=х-(а+ b ),

р/=10 эквивалентно р=р/10,

m*=n эквивалентно m=m*n,

г%=5 эквивалентно г=г%5.

Заметим, что вместо выражения а=а+2 предпочтительнее пи­сать в программе а+=2, поскольку второе выражение будет вы­числяться быстрее.

Операция явного преобразования типа (операция «тип»). Приме­нение этой операции имеет следующий формат:

Операндом могут быть константа, переменная, выражение. В результате значение операнда преобразуется к указанному типу. Примеры использования преобразования типа:

(long) 8, (float) 1 , (int) x%2

По поводу последнего выражения заметим, что приоритет опе­рации «тип» выше деления (и других бинарных арифметических операций), поэтому сначала значение переменной х приведется к целому типу (отбросится дробная часть), а затем выполнится де­ление по модулю.

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

В результате переменная с получит значение 0,5. Без преобразо­вания типа ее значение стало бы равно 0.

Операция sizeof . Эта операция имеет две формы записи:

sizeof (тип) и sizeof (выражение)

Результатом операции является целое число, равное количе­ству байтов, которое занимает в памяти величина явно указан­ного типа или величина, полученная в результате вычисления выражения. Последняя определяется также по типу результата выражения. Хотя по форме записи это похоже на функцию, од­нако sizeof является именно операцией. Ее приоритет выше, чем у бинарных арифметических операций, логических опера­ций и отношений. Примеры использования операции:

sizeof (int) результат — 2

sizeof (1) результат — 2

sizeof (0.1) результат — 8

sizeof (1L) результат — 4

sizeof (char) результат — 1

sizeof (' a') результат — 2

Операция «запятая». Эта необычная операция используется для связывания нескольких выражений в одно. Несколько выражений, разделенных запятыми, вычисляются последовательно слева на­право. В качестве результата такого совмещенного выражения при­нимается значение самого правого выражения. Например, если переменная х имеет тип int, то значение выражения (х=3, 5*х) будет равно 15, а переменная х примет значение 3.

Операция “ условие ?: ” . Это единственная операция, которая име­ет три операнда. Формат операции:

выражение1 ? выражение2 : выражение 3

Данная операция реализует алгоритмическую структуру ветв­ления. Алгоритм ее выполнения следующий: первым вычисляется значение выражения 1, которое обычно представляет собой некоторое условие. Если оно истинно, т.е. не равно 0, то вычисляется выражение 2 и полученный результат становится результатом опе­рации. В противном случае в качестве результата берется значение выражения 3.

Пример 1. Вычисление абсолютной величины переменной X можно организовать с помощью одной операции:

Пример 2. Выбор большего значения из двух переменных аи Ь:

Пример 3. Заменить большее значение из двух переменных аи b на единицу:

Правила языка в данном случае позволяют ставить условную операцию слева от знака присваивания.

Операции ( ) и [ ]. В языке Си круглые и квадратные скобки рассматриваются как операции, причем эти операции имеют наи­высший приоритет. Их смысл будет раскрыт позже.

Подведем итог всему разговору об операциях Си/Си++, сведя их в общую табл. 2 и расположив по рангам. Ранг операции — это порядковый помер в ряду приоритетов. Чем больше ранг, тем ниже приоритет. В таблице отражено еще одно свойство опера­ций — ассоциативность. Если одна и та же операция, повторя­ющаяся в выражении несколько раз, выполняется в порядке расположения слева направо, то она называется левоассоциа-тивной; если выполняется справа налево, то операция правоассоциативная. В таблице эти свойства отображены стрелками влево и вправо. Некоторые операции, присутствующие в таблице, пока не обсуждались.

Читайте также: