КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Приоритет операций
End. Begin Var Begin Var Begin Var Begin Var Var х: Integer; у: real; то оператор у:= х + 2; будет синтаксически правильным: хотя справа от знака присваивания стоит целочисленное выражение, а слева – вещественная переменная, компилятор сделает необходимые преобразования автоматически. В тоже время оператор х:= 2.0; будет неверным, так как автоматическое преобразование типа REAL (константа 2.0 содержит десятичную точку и, следовательно, принадлежит к типу REAL) в тип INTEGER в Турбо Паскале запрещено. Разумеется, запрет на автоматическое преобразование типов еще не означает, что в Турбо Паскале нет средств преобразования данных. Они, конечно же, есть, но их нужно использовать явно (подробнее об этом см. гл.4). Для преобразования данных в языке существуют встроенные функции, которые получают в качестве параметра значение одного типа, а возвращают результат в виде значения другого типа. В частности, для преобразования REAL в INTEGER имеются даже две встроенные функции такого рода: ROUND округляет REAL до ближайшего целого, a TRUNC усекает REAL путем отбрасывания дробной части. Например, ошибочным будет оператор х:= у/х; но правильным х:= round(у/х); (объявления переменных см. выше). Понятие функции в Турбо Паскале близко к понятию процедуры. Как и процедура, функция вызывается своим именем и может содержать произвольное число операторов Турбо Паскаля и даже внутренних процедур и функций. Существенным отличием функции от процедуры является то обстоятельство, что функция имеет собственное значение и, следовательно, может использоваться наравне с переменными в выражениях соответствующего типа. Для преобразования данных типа CHAR (символ) в целое число предназначена функция ORD, обратное преобразование INTEGER в CHAR осуществляет функция CHR. С помощью следующей несложной программы (пример 2.3) Вы сможете узнать внутренний код произвольного символа. Пример 2.3 Program Code_of_Char; {Программа читает символ с клавиатуры и выводит на экран этот символ и соответствующий ему внутренний код} ch: Char; {В эту переменную читается символ} Write('Введите любой символ: '); ReadLn(ch); {Читаем один символ} WriteLn(ch,' = ',ord(ch)); {Преобразуем его к целому и выводим на экран} END. Обратите внимание: при вызове WriteLn(ch,' = ',ord(ch)); третьим параметром обращения указан вызов функции ORD(CH), что с точки зрения языка является выражением; как мы увидим дальше (см. гл.8), во многих случаях при вызове процедур и функций в качестве параметров вызова можно указывать не только переменные или константы, но и выражения с их участием. По мере надобности мы будем знакомиться с другими функциями преобразования типов данных, а сейчас – о тех операциях, которые разрешены над различными типами. Конечно же, в Турбо Паскале есть все четыре арифметические операции над переменными REAL и INTEGER: + – сложение; – – вычитание; * – умножение; / – деление вещественное; div – деление целочисленное. Наличие двух операций деления есть еще одно проявление основополагающего принципа Турбо Паскаля: программист должен явно подтверждать компилятору, что он готов к возможным последствиям преобразования типов. Если, например, в языке Фортран используется выражение 1/2, то результат этого выражения будет зависеть от того, переменной какого типа он будет присвоен: если N есть переменная целого типа, а X – вещественного, то в программе на Фортране присваивания N = 1/2 X = 1/2 дадут значения 0 для N и 0.5 для X. В Турбо Паскале такой двусмысленности нет: выражение 1/2 всегда имеет значение 0.5 и поэтому оператор N: Integer; N:= 1/2; просто недопустим. В то же время допустимый в Турбо Паскале оператор X: real; X:= 1 div 2; самим фактом использования операции целочисленного деления DIV свидетельствует о том, что программист сознательно отбрасывает дробную часть результата. (Надеюсь, что читатель извинит явную искусственность этих примеров, которая вызвана лишь стремлением проиллюстрировать обсуждаемые особенности языка). Для данных типа INTEGER в Турбо Паскале есть еще одна операция MOD – получение остатка от целочисленного деления. Например: 5 mod 2 =1 31 mod 16 = 15 18 mod 3 =0 В Турбо Паскале отсутствует операция возведения в степень, что, очевидно, будет вызывать определенные неудобства при реализации вычислительных алгоритмов. Некоторым утешением может служить наличие встроенной функции SQR, возвращающей квадрат от значения параметра, причем тип результата определяется типом параметра. И еще об одном существенном недостатке Турбо Паскаля: в нем отсутствуют комплексный тип и соответствующие операции над ним. Вообще, в отношении реализации разнообразных вычислительных процедур Турбо Паскаль значительно уступает некоторым другим языкам программирования, в частности, тому же Фортрану. В частности, в нем намного беднее набор встроенных математических функций (см. гл. 4). При работе с целыми числами могут оказаться полезными две процедуры (здесь и далее в квадратных скобках указываются необязательные параметры): DEC(X [,N]) – уменьшает содержимое переменной X на значение выражения N (если N не задано, то на 1); тип переменной X и выражения N – INTEGER (точнее, любой целый, см. гл. 4); INC (X [,N]) – увеличивает значение X на N (если N не задано, то на 1). Над символами и строками символов определена единственная операция – сцепление двух строк. Операция обозначается символом «+». Например, программа st: String; st:= 'Турбо'+'–'+'Паскаль'; WriteLn(st); напечатает строку Турбо-Паскаль Все остальные действия над строками и символами реализуются с помощью встроенных процедур и функций (см. гл.4). И, наконец, об операциях отношения и логических операциях. Над данными типа REAL, INTEGER, CHAR, STRING определены следующие операции отношения (сравнения): = – равно; < > – не равно; < – меньше; > – больше; < = – меньше или равно, > = – больше или равно. В операциях сравнения должны участвовать однотипные операнды. Исключение сделано опять-таки в отношении REAL и INTEGER, которые могут сравниваться друг с другом. Результат применения операции отношения к любым операндам имеет тип BOOLEAN. Сравнение двух строк осуществляется следующим образом. Символы строк сравниваются попарно друг с другом так, что первый символ первой строки сравнивается с первым символом второй строки, второй символ первой строки – со вторым символом второй и т.д. Символы сравниваются путем сравнения их кодов во внутреннем представлении (см. гл. 4). Если одна строка короче другой, недостающие символы заменяются нулем. Отношение первой несовпадающей друг с другом пары символов и принимается за отношение двух строк. При сравнении данных типа BOOLEAN учитывается внутреннее соглашение Турбо Паскаля, в соответствии с которым FALSE есть нулевой байт, a TRUE – байт с единицей в младшем разряде. Заметим, что функция ORD преобразует к целому не только символы, но и логические величины, поэтому ord(false) = 0, ord(true) = 1 В Турбо Паскале определены следующие логические операции: not – логическое НЕ; or – логическое ИЛИ; and – логическое И; хоr – исключающее ИЛИ. Логические операции применимы к операндам целого и логического типов. Если операнды – целые числа, то результат логической операции есть тоже целое число (подробнее об этом сказано в гл.4). Логические операции над логическими данными дают результат логического типа. При вычислении выражений любого типа приоритет вычислений определяется расставленными скобками, а при их отсутствии – по табл. 2.1 (в порядке убывания приоритета). Таблица 2.1
Примечание. Операции @ (получение адреса), shl (сдвиг влево), shr (сдвиг вправо) и in принадлежность к множеству) описаны в гл.4. Следует учесть, что в отличие от многих других языков программирования в Турбо Паскале логические операции имеют более высокий приоритет, чем операции отношения. В связи с этим, в сложных логических выражениях обычно необходимо расставлять скобки. Если, например, b и c имеют тип INTEGER, то выражение а = b and с < d вызовет сообщение о синтаксической ошибке, так как сначала выполнится операция b and с. Правильным будет выражение: (а = b) and (с < d)
Дата добавления: 2014-11-06; Просмотров: 339; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |