Можно ли в качестве операнда в арифметическом выражении использовать
Содержание статьи
Электроника для всех
Содержание
Возврат к предыдущей части 1.2.12 Инициализация данных
Комбинация знаков операций и операндов, результатом которой является определенное значение, называется выражением. Знаки операций определяют действия, которые должны быть выполнены над операндами. Каждый операнд в выражении может быть выражением. Значение выражения зависит от расположения знаков операций и круглых скобок в выражении, а также от приоритета выполнения операций.
В языке СИ присваивание также является выражением, и значением такого выражения является величина, которая присваивается.
При вычислении выражений тип каждого операнда может быть преобразован к другому типу. Преобразования типов могут быть неявными, при выполнении операций и вызовов функций, или явными, при выполнении операций приведения типов.
Операнд — это константа, литерал, идентификатор, вызов функции, индексное выражение, выражение выбора элемента или более сложное выражение, сформированное комбинацией операндов, знаков операций и круглых скобок. Любой операнд, который имеет константное значение, называется константным выражением. Каждый операнд имеет тип.
Если в качестве операнда используется константа, то ему соответствует значение и тип представляющей его константы. Целая константа может быть типа int, long, uned int, uned long, в зависимости от ее значения и от формы записи. Символьная константа имеет тип int. Константа с плавающей точкой всегда имеет тип double.
Строковый литерал состоит из последовательности символов, заключенных в кавычки, и представляется в памяти как массив элементов типа char, инициализируемый указанной последовательностью символов. Значением строкового литерала является адрес первого элемента строки и синтаксически строковый литерал является немодифицируемым указателем на тип char. Строковые литералы могут быть использованы в качестве операндов в выражениях, допускающих величины типа указателей. Однако так как строки не являются переменными, их нельзя использовать в левой части операции присваивания.
Следует помнить, что последним символом строки всегда является нулевой символ, который автоматически добавляется при хранении строки в памяти.
Идентификаторы переменных и функций. Каждый идентификатор имеет тип, который устанавливается при его объявлении. Значение идентификатора зависит от типа следующим образом:
- идентификаторы объектов целых и плавающих типов представляют значения соответствующего типа;
- идентификатор объекта типа enum представлен значением одной константы из множества значений констант в перечислении. Значением идентификатора является константное значение. Тип значения есть int, что следует из определения перечисления;
- идентификатор объекта типа struct или union представляет значение, определенное структурой или объединением;
- идентификатор, объявляемый как указатель, представляет указатель на значение, заданное в объявлении типа;
- идентификатор, объявляемый как массив, представляет указатель, значение которого является адресом первого элемента массива. Тип адресуемых указателем величин — это тип элементов массива. Отметим, что адрес массива не может быть изменен во время выполнения программы, хотя значение отдельных элементов может изменяться. Значение указателя, представляемое идентификатором массива, не является переменной и поэтому идентификатор массива не может появляться в левой части оператора присваивания.
- идентификатор, объявляемый как функция, представляет указатель, значение которого является адресом функции, возвращающей значения определенного типа. Адрес функции не изменяется во время выполнения программы, меняется только возвращаемое значение. Таким образом, идентификаторы функций не могут появляться в левой части операции присваивания.
Вызов функций состоит из выражения, за которым следует необязательный список выражений в круглых скобках:
выражение-1 ([ список выражений ])
Значением выражения-1 должен быть адрес функции (например, идентификатор функции). Значения каждого выражения из списка выражений передается в функцию в качестве фактического аргумента. Операнд, являющийся вызовом функции, имеет тип и значение возвращаемого функцией значения.
Индексное выражение задает элемент массива и имеет вид:
выражение-1 [ выражение-2 ]
Тип индексного выражения является типом элементов массива, а значение представляет величину, адрес которой вычисляется с помощью значений выражение-1 и выражение-2.
Обычно выражение-1 — это указатель, например, идентификатор массива, а выражение-2 — это целая величина. Однако требуется только, чтобы одно из выражений было указателем, а второе целочисленной величиной. Поэтому выражение-1 может быть целочисленной величиной, а выражение-2 указателем. В любом случае выражение-2 должно быть заключено в квадратные скобки. Хотя индексное выражение обычно используется для ссылок на элементы массива, тем не менее индекс может появляться с любым указателем.
Индексные выражения для ссылки на элементы одномерного массива вычисляются путем сложения целой величины со значениями указателя с последующим применением к результату операции разадресации (*).
Так как одно из выражений, указанных в индексном выражении, является указателем, то при сложении используются правила адресной арифметики, согласно которым целая величина преобразуется к адресному представлению, путем умножения ее на размер типа, адресуемого указателем. Пусть, например, идентификатор arr объявлен как массив элементов типа double.
Таким образом, чтобы получить доступ к i-тому элементу массива arr можно написать аrr[i], что, в силу сказанного выше, эквивалентно i[a]. При этом величина i умножается на размер типа double и представляет собой адрес i-го элемента массива arr от его начала. Затем это значение складывается со значением указателя arr, что в свою очередь дает адрес i-го элемента массива. К полученному адресу применяется операция разадресации, т.е. осуществляется выборка элемента массива arr по сформированному адресу.
Таким образом, результатом индексного выражения arr[i] (или i[arr]) является значение i-го элемента массива.
Выражение с несколькими индексами ссылается на элементы многомерных массивов. Многомерный массив — это массив, элементами которого являются массивы. Например, первым элементом трехмерного массива является массив с двумя измерениями.
Для ссылки на элемент многомерного массива индексное выражение должно иметь несколько индексов заключенных к квадратные скобки:
выражение-1 [ выражение-2 ][ выражение-3 ] …
Такое индексное выражение интерпретируется слева направо, т.е. вначале рассматривается первое индексное выражение:
выражение-1 [ выражение-2 ]
Результат этого выражения есть адресное выражение, с которым складывается выражение-3 и т.д. Операция разадресации осуществляется после вычисления последнего индексного выражения. Отметим, что операция разадресации не применяется, если значение последнего указателя адресует величину типа массива.
Пример:
Рассмотрим процесс вычисления индексного выражения mass[1][2][2].
- 1. Вычисляется выражения mass[1]. Ссылка индекс 1 умножается на размер элемента этого массива, элементом же этого массива является двухмерный массив содержащий 5х3 элементов, имеющих тип int. Получаемое значение складывается со значением указателя mass. Результат является указатель на второй двухмерный массив размером (5х3) в трехмерном массиве mass.
- 2. Второй индекс 2 указывает на размер массива из трех элементов типа int, и складывается с адресом, соответствующим mass [1].
- 3. Так как каждый элемент трехмерного массива — это величина типа int, то индекс 2 увеличивается на размер типа int перед сложением с адресом mass [1][2].
- 4. Наконец, выполняется разадресация полученного указателя. Результирующим выражением будет элемент типа int.
Если было бы указано mass [1][2], то результатом был бы указатель на массив из трех элементов типа int. Соответственно значением индексного выражения mass [1] является указатель на двухмерный массив.
Выражение выбора элемента применяется, если в качестве операнда надо использовать элемент структуры или объединения. Такое выражение имеет значение и тип выбранного элемента. Рассмотрим две формы выражения выбора элемента:
выражение.идентификатор ,
выражение->идентификатор .
В первой форме выражение представляет величину типа struct или union, а идентификатор — это имя элемента структуры или объединения. Во второй форме выражение должно иметь значение адреса структуры или объединения, а идентификатор — именем выбираемого элемента структуры или объединения.
Обе формы выражения выбора элемента дают одинаковый результат. Действительно, запись, включающая знак операции выбора (->), является сокращенной версией записи с точкой для случая, когда выражению стоящему перед точкой предшествует операция разадресации (*), примененная к указателю, т.е. запись
выражение -> идентификатор
эквивалентна записи
(* выражение) . идентификатор
в случае, если выражение является указателем.
Пример:
1 2 3 4 | struct tree { float num; int spisoc[5]; struct tree *left; } tr[5] , elem ; elem.left = & elem; |
В приведенном примере используется операция выбора (.) для доступа к элементу left структурной переменной elem. Таким образом элементу left структурной переменной elem присваивается адрес самой переменной elem, т.е. переменная elem хранит ссылку на себя саму.
Приведение типов это изменение (преобразование) типа объекта. Для выполнения преобразования необходимо перед объектом записать в скобках нужный тип:
( имя-типа ) операнд.
Приведение типов используются для преобразования объектов одного скалярного типа в другой скалярный тип. Однако выражению с приведением типа не может быть присвоено другое значение.
Пример:
1 2 3 | int i; bouble x; b = (double)i+2.0; |
В этом примере целая переменная i с помощью операции приведения типов приводится к плавающему типу, а затем уже участвует в вычислении выражения.
Константное выражение — это выражение, результатом которого является константа. Операндом константного выражения могут быть целые константы, символьные константы, константы с плавающей точкой, константы перечисления, выражения приведения типов, выражения с операцией sizeof и другие константные выражения. Однако на использование знаков операций в константных выражениях налагаются следующие ограничения:
1. В константных выражениях нельзя использовать операции присваивания и последовательного вычисления (,) .
2. Операция «адрес» (&) может быть использована только при некоторых инициализациях.
Выражения со знаками операций могут участвовать в выражениях как операнды. Выражения со знаками операций могут быть унарными (с одним операндом), бинарными (с двумя операндами) и тернарными (с тремя операндами).
Унарное выражение состоит из операнда и предшествующего ему знаку унарной операции и имеет следующий формат:
- знак-унарной-операции операнд .
- Бинарное выражения состоит из двух операндов, разделенных знаком бинарной операции:
- операнд1 знак-бинарной-операции операнд2 .
- Тернарное выражение состоит из трех операндов, разделенных знаками тернарной операции (?) и (:), и имеет формат:
- операнд1 ? операнд2 : операнд3 .
Операции. По количеству операндов, участвующих в операции, операции подразделяются на унарные, бинарные и тернарные.
В языке Си имеются следующие унарные операции:
- — арифметическое отрицание (отрицание и дополнение);
- ~ побитовое логическое отрицание (дополнение);
- ! логическое отрицание;
- * разадресация (косвенная адресация);
- & вычисление адреса;
- + унарный плюс;
- ++ увеличение (инкремент);
- — уменьшение (декремент);
- sizeof размер .
Унарные операции выполняются справа налево.
Операции увеличения и уменьшения увеличивают или уменьшают значение операнда на единицу и могут быть записаны как справа так и слева от операнда. Если знак операции записан перед операндом (префиксная форма), то изменение операнда происходит до его использования в выражении. Если знак операции записан после операнда (постфиксная форма), то операнд вначале используется в выражении, а затем происходит его изменение.
В отличие от унарных, бинарные операции, список которых приведен в табл.7, выполняются слева направо.
Таблица 7
Знак операции | Операция | Группа операций |
---|---|---|
* | Умножение | Мультипликативные |
/ | Деление | |
% | Остаток от деления | |
+ | Сложение | Аддитивные |
— | Вычитание | |
<< | Сдвиг влево | Операции сдвига |
>> | Сдвиг вправо | |
< | Меньше | Операции отношения |
<= | Меньше или равно | |
>= | Больше или равно | |
== | Равно | |
!= | Не равно | |
& | Поразрядное И | Поразрядные операции |
| | Поразрядное ИЛИ | |
^ | Поразрядное исключающее ИЛИ | |
&& | Логическое И | Логические операции |
|| | Логическое ИЛИ | |
, | Последовательное вычисление | Последовательного вычисления |
= | Присваивание | Операции присваивания |
*= | Умножение с присваиванием | |
/= | Деление с присваиванием | |
%= | Остаток от деления с присваиванием | |
-= | Вычитание с присваиванием | |
+= | Сложение с присваиванием | |
<<= | Сдвиг влево с присваиванием | |
>>= | Сдвиг вправо присваиванием | |
&= | Поразрядное И с присваиванием | |
|= | Поразрядное ИЛИ с присваиванием | |
^= | Поразрядное исключающее ИЛИ с присваиванием |
Левый операнд операции присваивания должен быть выражением, ссылающимся на область памяти (но не объектом объявленным с ключевым словом const), такие выражения называются леводопустимыми к ним относятся:
- идентификаторы данных целого и плавающего типов, типов указателя, структуры, объединения;
- индексные выражения, исключая выражения имеющие тип массива или функции;
- выражения выбора элемента (->) и (.), если выбранный элемент является леводопустимым;
- выражения унарной операции разадресации (*), за исключением выражений, ссылающихся на массив или функцию;
- выражение приведения типа если результирующий тип не превышает размера первоначального типа.
При записи выражений следует помнить, что символы (*), (&), (!), (+) могут обозначать унарную или бинарную операцию.
Читать далее. Раздел 1.3.2 Комментарии в программе
Содержание
Источник
Выражения, операнды, операции
Тема 11
При выполнении программы осуществляется обработка данных, в ходе которой с помощью выражений вычисляются и используются различные значения. Выражение представляет собой конструкцию, определяющую состав данных, операции и порядок выполнения операций над данными. Выражение состоит из операндов, знаков операций и круглых скобок. В простейшем случае выражение может состоять из одной переменной или константы. Тип значения выражения определяется типом операндов и составом выполняемых операций.
Операнды представляют собой данные, над которыми выполняются действия. В качестве операндов могут использоваться константы, переменные, элементы массивов и функции.
Операции — это действия, которые выполняются над операндами. Операции бываю унарными и бинарными. Унарная операция относится к одному операнду, и ее знак записывается перед операндом, например, — x. Бинарная операция выражает отношение между двумя операндами, и знак ее записывается между операндами, например, x + y.
Круглые скобки используются для указания порядка выполнения операций.
Если в операциях используется несколько данных, то их типы должны быть либо идентичными, либо совместимыми.
В зависимости от типов операций и операндов выражения могут быть арифметическими, логическими и строковыми.
Арифметические выражения (АВ). Результатом выполнения АВ является число, тип которого зависит от типов операндов, составляющих это выражение. В АВ можно использовать числовые типы (целочисленные и вещественные), арифметические операции и функции, возвращающие числовое значение.
Тип значения АВ определяется типом операндов и операциями. Если в операции участвуют целочисленные операнды, то результат операции также будет целочисленного типа. Если хотя бы один из операндов принадлежит к вещественному типу, то результат также будет вещественным. Исключением является операция деления, результат которой всегда вещественный.
Унарные арифметические операции + (Сохранение знака) и -(Отрицание знака) относятся к знаку числа и не меняют типа числа.
Примеры. Пусть в программе есть строки:
var a, b, c, d: integer; x, y: real;
. . .
a:=40; b:=13 ;
c:= a div b; d:= a mod b; //c=3, d=1
y:=sin(a) + b/exp(x) — 12.5; // y=sin a + b/ e x — 12,5
Над данными целочисленного типа можно выполнять также следующие побитовые (поразрядные) операции:
o Shl- сдвиг влево;
o Shr- сдвиг вправо;
o And- И (арифметическое умножение);
o Or- ИЛИ (арифметическое сложение);
o Xor- арифметическое исключающее ИЛИ;
o Not- Не (арифметическое отрицание).
Особенностью побитовых операций является то, что они выполняются над операндами поразрядно.
Примеры. Пусть в программе есть строки:
var a, b, c, d: integer;
. . .
a:=5; b:=9 ;
c:= Not a; // a= 0101, Not (0101) = 1010 =10 дес .
d:= a And b; // b=1001, 0101 And 1001 = 0001 = 1 дес .
Логические выражения (ЛВ). Результатом выполнения ЛВ является логическое значение Trueили False. Такие выражения чаще всего используются в условных операторах и операторах цикла. Логические выражения могут содержать:
o логические константы Trueи False;
o логические переменные типа Boolean;
o операции сравнения (отношения);
o логические операции;
o круглые скобки.
Для установления отношения между двумя значениями, заданными выражениями, переменными или константами, используются следующие операции сравнения: =,<,>, <=,>=,<>. Операции сравнения выполняются после вычисления соответствующих выражений. Результатом операции сравнения является значение False, если соответствующее отношение не имеет место, и значение Trueв противном случае.
Результат выполнения логических операций при применении их к логическим выражениям (операндам логического типа) будет логического типа (Boolean). Логические операции And, Or, Xor являются бинарными, операция Not- унарной.
Источник
В ПОМОЩЬ СТУДЕНТУ И ШКОЛЬНИКУ
Горбачев Л.И. Основы программирования в среде Turbo Pascal. [НАЗАД] [ДАЛЕЕ] Выражения, операнды, операции.Операнд — величина, представляемая собой объект операции, реализуемой ЭВМ в ходе выполнения программы вычислений. Переменные и константы всех типов используются в выражениях. Выражение задает порядок выполнения действий над элементами данных и состоит из операндов (констант, переменных, обращений к функциям), круглых скобок и знаков операций. Операции определяют действия, которые надо выполнить над операндами. Например, в выражении (X + Y — 10) X, Y и 10 — операнды; «+», «-» — знаки операций сложения и вычитания. В простейшем случае выражение может состоять из одной переменной или константы. Круглые скобки ставятся так же, как и в обычных арифметических выражениях для управления ассоциативностью и порядком выполнения операций. Операции в языке Паскаль подразделяются на арифметические, отношения, логические (булевские), операцию @ (указатель), строковые и т.д. в зависимости от того, какого типа операнды и операции в них используются. Операции могут быть унарными и бинарными. В первом случае операция относится к одному операнду и всегда записывается перед ним, во втором операция выражает отношение между двумя операндами и записывается между ними. 6.1. Арифметические выражения и операции.Выражения — это конструкции, определяющие действия, которые должны быть выполнены для вычисления величин. Поскольку результатом выполнения этих действий будет величина, само выражение можно считать конструкцией, представляющей величину. Арифметическое выражение порождает целое или действительное значение. Наиболее простыми формами арифметических выражений являются: целая или действительная константа без знака; целая или действительная переменная; элемент массива целого или действительного типа; функция, принимающая целое или действительное значение. Значение переменной или элемента массива должно быть определено до их появления в арифметическом выражении. Другие арифметические выражения составляются из вышеперечисленных простых форм путем применения круглых скобок и арифметических операций. Арифметические операции выполняют арифметические действия в выражениях над значениями операндов целочисленных и вещественных типов. Арифметические операции языка Паскаль представлены в виде следующей таблицы:
Целочисленное деление (div) отличается от обычной операции деления тем, что возвращает целую часть частного, дробная часть отбрасывается. Перед выполнением операции оба операнда округляются до целых значений. Результат целочисленного деления всегда равен нулю, если делимое меньше делителя. 11 div 5 = 2 10 div 3 = 3 2 div 3 = 0 Деление по модулю (mod) возвращает остаток, полученный при выполнении целочисленного деления, иначе говоря I mod J = I — (I div J) * J. Если J = 0, то возникает ошибка. 11 mod 5 = 1 10 mod 3 = 1 14 mod 5 = 4 Арифметическое «И» (and) производит логическое умножение операндов в соответствии со следующей таблицей истинности: 1 and 1 = 1 1 and 0 = 0 0 and 1 = 0 0 and 0 = 0 Операнды записываются в десятичной форме, но во время выполнения переводятся в двоичную форму. Результат представлен в десятичной форме.Пример: Вычислить результат выражения A and B, если A = 12 и B = 22. A и B занимают в памяти 2 байта и в двоичной форме имеют вид: 000000000001100 и 000000000010110. В результате выполнения операции 000000000001100 and 000000000010110 в соответствии с таблицей истинности получим результат 0000000000000100, или 4 в десятичной форме. Следовательно, 12 and 22 = 4. Сдвиг влево (K shl N) восстанавливает в качестве результата значение, полученное путем сдвига на N позиций влево представленного в двоичной форме числа K. Пример: Вычислить результат выполнения выражения 2 shl 7. Число 2 занимает в памяти 2 байта и в двоичной форме имеет вид 000000000000010. Сдвигаем каждый бит на 7 позиций влево, получаем 000000010000000, что соответствует числу 256 в десятичной форме. Следовательно, 2 shl 7 = 256. Сдвиг вправо (shr) выполняется аналогично, с той лишь разницей, что сдвиг производится вправо. 160 shr 2 = 40 90 shr 2 = 22 256 shr 7 = 2 Логическое сложение (or) выполняет сложение операндов в двоичной форме в соответствии с таблицей истинности: 1 or 1 = 1 1 or 0 = 1 0 or 1 = 1 0 or 0 = 0 Результат представлен в десятичной форме. Пример: Вычислить результат выполнения выражения 12 or 22. 12 и 22 занимают в памяти по 2 байта и в двоичной форме имеют вид: 000000000001100 и 000000000010110 соответственно. Выполнив сложение в соответствии с таблицей истинности, получим двоичное значение суммы 0000000000011110, что соответствует числу 30 в десятичной форме. Следовательно, 12 or 22 = 30. Исключающее «ИЛИ» (xor) производит сложение операндов в соответствии с таблицей истинности: 1 xor 1 = 0 1 xor 0 = 1 0 xor 1 = 1 0 xor 0 = 0 Результат преобразовывается в десятичную форму. Пример: Вычислить результат выполнения выражения 12 xor 22. 12 и 22 занимают в памяти 2 байта и в двоичной форме имеют вид: 000000000001100 и 000000000010110 соответственно. Выполнив сложение по таблице истинности, получим двоичное значение суммы: 0000000000011010 или 26 в десятичной форме. Следовательно, 12 xor 22 = 26. Применение операции not к данным целочисленных типов вызывает побитную инверсию (отрицание) соответствующего данному числу двоичного кода. not 0 = -1 not 78 = -79 Пример: Вычислить результат выполнения выражения not 78. Число 78 занимает в памяти 2 байта и в двоичной форме имеет вид: 0000000001001110. При выполнении операции все 0 заменяются на 1, а 1 — на 0 соответственно. После выполнения операции not 78 получим: 1111111110110001, что соответствует числу -79 в десятичной форме. В любом выражении, если один или более операндов имеют вещественный тип, то результат будет тоже вещественного типа. В операциях div и mod оба операнда должны быть целого типа. В Турбо Паскале нет операции возведения в степень. При необходимости ее использования применяют стандартные функции: X^A (x в степени а) = Exp(A * Ln(X)); Однако таким образом нельзя возвести в целую степень отрицательное число (это можно сделать с использованием операторов цикла). 6.2. Выражения и операции отношения.Выражения отношения определяет истинность или ложность результата. Операции отношения выполняют сравнение двух операндов и определяют, истинно ли значение выражения или ложно. В языке Паскаль операции отношения и булевские операции важны, так как они интенсивно используются для управления циклами и в условных операторах. Сравниваемые величины могут принадлежать к любому скалярному или перечисляемому типу данных. Результат всегда имеет булевский тип и принимает одно из двух значений: True (истина) или False (ложь).
6.3. Логические выражения и операции.Логические выражения строятся из логических констант и переменных, логических операций и операций отношения. В операциях отношения могут участвовать арифметические и логические выражения, а также символьные данные. Результатом выполнения логического (булевского) выражения является логическое значение True или False. Операндами служат данные только булевского типа. Простейшими видами логических выражений являются следующие: логическая константа; логическая переменная; элемент массива логического типа; логическая функция; выражение отношения. Другие логические выражения строятся из вышеперечисленных путем применения логических операций и круглых скобок.
Логические операции not, and, or, xor могут выполняться не только над логическими операндами (A, B), но и над целыми числами. В этом случае выполняются соответствующие побитовые операции с учетом двоичного представления операндов. При выполнении операций отношения оба операнда (A, B) должны быть одного и того же типа. Допускается лишь одно исключение: A — целого типа, B — вещественного (и наоборот). 6.4. Приоритет операций.Выполнение каждой операции происходит с учетом ее приоритета. Значения приоритетов приведены ниже в таблице.
Для определения старшинства операций имеется три основных правила:
[НАЗАД] [ДАЛЕЕ] |
Источник