В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова - Введение в язык Паскаль (1107618), страница 18
Текст из файла (страница 18)
До главы, посвященной функциям, мы будем использовать только стандартные функции, определяемые самим я з ы к о м — снекоторыми из таких функций мы познакомились при рассмотрении стандартных типов данных в главе 2.С другой стороны, поскольку каждое выражение должно определятьзначение какого-то определенного типа, то в нем могут фигурироватьоперанды тоже определенных типов. Кроме того, как мы это уже знаемна примере стандартных скалярных типов, над каждым типом значенийв языке определен свой набор операций.
В связи с этим на данном этапе изложения паскаля довольно трудно дать единое синтаксическое определение для выражений всех допустимых в паскале типов, которое было бы идостаточно компактным, и достаточно понятным. Поэтому выраженияразных типов мы будем рассматривать отдельно, по мере изложения имеющихся в паскале типов значений. В настоящей главе мы будем рассматривать выражения стандартных скалярных типов и соответствующие имоператоры присваивания.4.2.1. Арифметический оператор присваиванияАрифметический оператор присваивания служит для присваивания значения63переменной арифметического типа, т.е.
типа real или integer. В связи с этими в правой части такого оператора должно фигурировать арифметическоевыражение, т.е. выражение, задающее правило вычисления значения одногоиз этих типов.Если переменная в левой части оператора присваивания имеет тип real, тоарифметическое выражение может определять значение как типа real, таки типа integer — в последнем случае предполагается, что получаемое целочисленное значение автоматически преобразуется в вещественное значение(типа real).
Если же переменная в левой части имеет тип integer, то арифметическое выражение обязательно должно определять значение этого жетипа. Правда, иногда требуемое целочисленное значение бывает невозможновычислить непосредственно, а правила его вычисления приходится задаватьс помощью арифметического выражения, которое искомое целочисленноезначение определяет приближенно, т.е. в виде значения типа real. В такихслучаях правило преобразования вещественного значения в целое (путемотбрасывания дробной части или путем округления до ближайшего целогочисла) должно быть явно задано в самом выражении.Все операнды арифметического выражения должны иметь тип real илиinteger.
В качестве основных операндов используются: константа (числобез знака или имя константы), переменная и функция. Напомним, что впаскале предусмотрены две категории арифметических операций: мультипликативные (*, /, div, mod) и аддитивные (+, —). Операции в каждой изэтих категорий имеют одинаковый ранг (старшинство), причем мультипликативные операции имеют более высокий ранг, чем аддитивные, т.е.выполняются в первую очередь.
Операции одного и того же ранга, если онивстречаются в выражении подряд, выполняются в порядке их следованияслева направо. В случае необходимости желаемый порядок выполненияопераций можно задать с помощью круглых скобок: подвыражения(части выражения), заключенные в скобки, вычисляются независимо ираньше, чем будут выполняться предшествующие и последующие операции.Заметим, что операции сложения и вычитания в начале выражения (или подвыражения, заключенного в круглые скобки), могут использоваться ик а к одноместные операции. Например, запись вида —А является сокращением записи вида О—А.Примеры арифметических выражений (справа от выражения указан порядок его вычисления с учетом типа результата каждой из операций итипа значений используемых функций) :2*3+4*59 div 4/240/5/10((2*3)+(4*5)=26)((9 div 4)/2-1.0)(<40/5)/10=0.8)-sqrt(sqr(3J+32/2)((2+4)/10+2/4)*2(- sqrt(sqr <3) + <32/2> >=-5.0)((((2+4)/10)+(2/4))*2=2.2)2*trunc(6.9)-round(-1.8)((2*trunc(6.9))-round(-1.B)=14)Примеры арифметических операторов присваивания (в предположении,что х^ а, Ь, с, г - переменные типа real, i— переменная типа integer, pi —константа, являющаяся именем вещественного числа 3.14159) :64х := 0 (переменной х присваивается значение, равное нулю);i := i + 1 (текущее значение переменной i увеличивается на единицу);с := sqrt (а * а + b * Ь)(вычисление длины гипотенузы по длинамкатетов а, Ь);х := 2 * pi * г (вычисление длины окружности х по радиусу г).Следующие записи либо не являются операторами присваивания по синтаксису, либо недопустимы в языке паскаль:3 := i + 2 (в левой части не может фигурировать константа);х = 2* pi * г (символ "=" не есть знак операции присваивания):i : = 5 / 4 (целочисленной переменной присваивается вещественное значение) :х := а * — Ь/2 (недопустимы два знака операций подряд).В заключение приведем синтаксическое определение арифметического выражения :арифметическое выражение)::*^слагаемое)Т+ ~ т—J• слагаемое >: :множительТ ~ 1*/J _ Jт — Тd1Vmod1))"".множитель) : : =—^константа без знак^ <переменная)Функция)" 1 — а р и ф м е т и ч е с к о е выражение) "(константа без знака>::=%•(число без знака)(имя константы) —1—'4.2.2.
Логический оператор присваиванияЕсли в левой части оператора присваивания указана переменная типаboolean, то в правой части оператора должно быть задано логическое выражение. задающее правило вычисления логического значения (true илиfalse).В логическом выражении используются те же виды операндов, что и варифметическом выражении (константы, переменные и функции), толькокаждый операнд логической операции должен иметь тип boolean.
Специфическим видом операнда какой-либо логической операции в логическом выражении является отношение. Поскольку мы знакомы еще не со всеми типами значений паскаля, то дадим пока частичное определение этого понятия: запись вида( арифметическое выражение X операция сравнения >(арифметическое выражение >5. В.Г. Абрамов65является отношением, где(операция сравнения > ::= < | < | = | Ф | >.| >Отношение имеет значение true, если заданное в нем с помощью операции сравнения соотношение между значениями арифметических выраженийдействительно имеет место, и значение false — в противном случае. Например, отношение 3 < 5 имеет значение true, а отношение 3 > 5 - значение false.Любое из фигурирующих в отношении арифметических выраженийможет быть как вещественным, так и целочисленным — предполагается, чтопри сравнении целого числа с вещественным оно предварительно преобразуется в вещественное число.Как видно, в логическом выражении из-за наличия в нем отношениймогут присутствовать как арифметические,так и логические операции.
Приэтом самой старшей операцией является операция not, применимая к логическомуоперанду,затемследуютмультипликативныеоперации(*, /. div, mod,and), потом - аддитивные операции (+, —, o r ) , и самый низкий приоритет имеют операции сравнения (т.е. они выполняются в последнюю очередь). Операции одинакового старшинства выполняются в порядкеих следования в выражении слева направо. Для задания любого желаемогопорядка выполнения операций, как обычно, используются круглые скобки.Более точно логическое выражение можно определить следующимобразом:(логическое выражение 4 ::=~ ^'отношение•простое выражениет-простое выражение>::=-.логическое слагаемое;Z<логическое слагаемое;::=логический множитель~СandJчлогический множитель>::=константа>•переменнаяфункция/логическии множитель• not -:- (—"•Г-ЦМР?СК ое выражение —При этом имеется в виду, что здесь < константа >, (переменная >и < функция > должны иметь тип boolean.66Примеры логических выражений (d.
b, с — логические, х, у - вещественные, к - целочисленная переменные):х<2 *у(отношение)true(константа)d(переменная)odd(K)(функция)not not d(логический множитель)(х > у/2)(логический множитель)d and (х Ф у) and b (логическое слагаемое)(с or d) and (х = у) or not b (простое выражение)Еще раз подчеркнем, что в паскале операции отношения являются самыми младшими, так что если отношение является не самостоятельнымвыражением, а одним из операндов какой-либо логической операции, тооно должно быть заключено в круглые скобки.
Так, если dлогическаяпеременная, а х, у — вещественные переменные, то записьd or х > убессмысленна, ибо в силу принятого старшинства операций она будеттрактоваться как ( d o r х) > у, где один из операндов логической операции (or) является вещественным числом. Если мы хотим, чтобы логическая операция or применялась к значениям переменной d и отношения х > у,то логическое выражение должно быть записано в виде d or ( х > у ) . Впрочем, эта особенность использования отношений отражена и в синтаксическом определении логического выражения.Правила вычисления значения логического выражения достаточно очевидны. Например, при вычислении значения выраженияd or (х * у/2 > х + у) and not b or (х > 2 * z)Надо вместо всех фигурирующих здесь переменных взять их текущиезначения и выполнить над ними заданные в выражении операции с учетомих старшинства и расставленных скобок:(d ог((((х * у)/2) > (х + у )) and (not b)))or(x > (2 * z))Выше мы исходили из того, что операндами операции отношения являются арифметические выражения, однако это не обязательно.
В связи с тем,что в паскале упорядочены значения ряда скалярных типов (в том числезначения типа boolean и char), в отношении могут фигурировать выражениялюбых из этих типов (разумеется, оба выражения должны быть одного итого же типа) . Так что если d, b, с — логические переменные, a sym — литерная переменная, то на паскале допустимы, например, отношенияd or b < not с, sym Ф ' + '.В силу специфики логических операций значение логического выражения может оказаться известным еще до окончания всего выражения. Например, для выражения( x > 0 ) a n d ( x < Г)(которое принимает значение true, если точка М ( х ) , лежащая на осиабсцисс, принадлежит отрезку [0, 1], и значение false в противном случае)при отрицательном значении х уже но вычислении первого множителя (значения отношения х > 0) становится ясным значение всего выражения это значение есть false, так что вычислять второй множитель, вообще гово5*67ря, нет необходимости.