Главная » Delphi » Язык программирования Object Pascal

0

Комментарии

Начнем рассмотрение темы с того,  каким образом следует вносить комментарии в программу на языке  Object Pascal. Этот язык  поддерживает три  типа  комментариев — с использованием фигурных скобок, пар скобка–звездочка и двойной наклонной чер ты (в стиле C++). Ниже  приведены три примера комментариев Object  Pascal:

{      Комментарий с использованием фигурных скобок }

(* Комментарий с использованием пары скобка+звездочка *)

// Комментарий с использованием двойной наклонной черты

Поведение первых двух типов  комментариев идентично. Object  Pascal считает комментарием все, что  находится между символом (или  парой символов) начала  ком ментария и символом завершения комментария, включая  символы перехода на новую строку.  Комментарий в виде  двойной косой  черты продолжается только   до  конца строки.

НА ЗАМЕТКУ

В Object Pascal нельзя использовать вложенные комментарии одного и того же типа. И хотя синтаксис Object Pascal позволяет создавать вложенные комментарии различного типа, но пользоваться этой возможностью не рекомендуется.

{ (* Допустимо *) } (* { Допустимо } *)

(* (* Недопустимо *) *)

{ { Недопустимо } }Дополнительные возможности процедур и функций

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

Скобки при вызове функций

Хотя  добавление скобок  при  вызове функции  или  процедуры без  параметров не является новинкой, но про  такую возможность знают  далеко  не  все.  В Object Pascal считаются корректными оба варианта вызова:

Form1.Show; Form1.Show();

Это, конечно, возможность не из тех, которые сильно  удивляют.  Однако програм мисты, вынужденные делить  свое рабочее время  между разными языками (например Delphi, C и Java), оценят ее по достоинству, ибо им не придется задумываться о разли чии синтаксиса вызова  функций в различных языках.

Перегрузка

В Delphi  4 была  реализована концепция перегрузки функций (overloading), которая позволяет иметь  несколько различных функций или процедур с одинаковым именем, но разными списками параметров. Такие  процедуры и функции должны  быть  описа ны с применением директивы overload:

procedure Hello(I: Integer); overload; procedure Hello(S: String); overload; procedure Hello(D: Double); overload;

Заметим, что правила перегрузки методов класса,  сформулированные в соответст вующей главе книги, несколько отличаются от правил перегрузки обычных процедур и функций. Хотя предоставления возможности перегрузки функций программисты требовали с момента выхода  в свет  Delphi  1, тем  не  менее  это  не  самая  безопасная возможность языка.  Наряду  с уже имевшейся возможностью использования в разных модулях  функций  с одним  и  тем  же  именем, применение перегруженных функций может  стать  неиссякаемым источником  трудноуловимых ошибок  в программе. По этому сто раз подумайте, прежде чем использовать перегрузку. Помните золотое пра вило: “Можно потреблять, но не злоупотреблять!”.

Значения параметров по умолчанию

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

procedure HasDefVal(S: string; I: Integer = 0);

Процедура HasDefVal() может быть вызвана двумя способами. В первом случае —

как обычно, с указанием обоих параметров:

HasDefVal(‘hello’, 26);

Во втором случае можно  задать  только  значение параметра S, а для параметра I

использовать значение, установленное по умолчанию:

HasDefVal(‘hello’); // Для I используется значение по умолчанию

При  использовании  значений  параметров  по  умолчанию  следует  помнить  о  не

скольких приведенных ниже правилах.

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

•    Значения по умолчанию могут присваиваться только параметрам обычных ти

пов, указателям или множествам.

•   Значение по умолчанию может  передаваться только  по значению либо  с моди фикатором const. Оно  не может  быть  ссылкой или  нетипизированным пара метром.

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

function AddInts(I1, I2: Integer): Integer;

begin

Result := I1 + I2;

end;

Допустим, что  маркетинговые исследования показали целесообразность добавле ния  в программу возможности сложения трех  чисел.  Замена существующей  функции на  другую, способную  складывать три  числа,  приведет к необходимости исправить весь код программы, который перестанет компилироваться из за внесения в функцию еще  одного  параметра. Но  при  использовании значений параметров по  умолчанию проблема решается легко  и просто. Достаточно изменить объявление функции так, как показано ниже.

function AddInts(I1, I2: Integer; I3: Integer = 0);

begin

Result := I1 + I2 + I3;

end;

Переменные

У начинающих программистов бытует  мнение: “Если мне  понадобится еще  одна переменная — я опишу ее прямо  здесь,  посреди кода,  в том месте,  где она  понадоби лась”. Для  таких  языков, как Java, C или  Visual Basic, —  это  вполне допустимо. Но  в языке  Object Pascal  все переменные обязательно должны  быть  описаны в соответст вующем разделе  var, расположенном в начале  процедуры, функции  или  программы. Предположим, на C++ код функции выглядит так:

void foo(void)

{

int x = 1;

x++;

int y = 2;

float f;

//…и так далее…

}

Аналогичная функция на Object  Pascal должна выглядеть следующим образом:

Procedure Foo;

var

x, y: Integer;

f: Double;

begin

x := 1;

inc(x);

y := 2;

//…и так далее…

end;

НА ЗАМЕТКУ

Object Pascal (как и Visual Basic), в отличие от Java и C, не чувствителен к регистру символов. Использование строчных и прописных символов сводится к тому, чтобы сделать код более удобочитаемым. Например, сложно воспринять имя процедуры, за- писанное как:

procedure thisprocedurenamemakenosense;

Значительно понятнее имена процедур, которые записаны в таком виде:

procedure ThisProcedureNameIsMoreClear;

Возникает вполне резонный  вопрос: в  чем  же  тогда  преимущества  и  удобства Object  Pascal? Вскоре  вы убедитесь, что такая  строгая структура  программы делает  ее более  понятной, удобочитаемой и, как следствие, она проще в отладке  и сопровожде нии,  чем у других языков, которые полагаются скорее на общепринятые соглашения, а не на жесткие правила.

Обратите внимание, Object  Pascal  позволяет объявить более  одной  переменной одинакового типа в одной строке:

VarName1, VarName2: SomeType;Не  забывайте, что  объявление переменной в Object  Pascal  состоит из  ее  имени, двоеточия и типа  переменной. Запомните: в Object Pascal переменная всегда инициа лизируется отдельно от своего объявления.

Начиная с Delphi 2.0, язык  позволяет инициализировать глобальные переменные в разделе их объявления (var). Приведенный ниже  пример демонстрирует синтаксис такого объявления.

var

i: Integer = 10;

S: string       = ‘Hello world';

D: Double       = 3.141579;

НА ЗАМЕТКУ

Предварительная  инициализация возможна только для глобальных переменных и недо-

пустима для переменных, являющихся локальными для процедуры или функции.CОВЕТ

Компилятор Delphi автоматически инициализирует все глобальные переменные нуле- вым значением. Таким образом, при запуске программы все глобальные переменные целого типа примут значение 0, переменные с плавающей точкой — 0.0, строки ока- жутся пустыми, а указатели будут иметь значение nil. Поэтому в исходном коде спе- циальная инициализация глобальных переменных нулевым значением не требуется.

Константы

Константы в Object Pascal определяются в специальном разделе директивой const, действие которой аналогично ключевому  слову const в языке  C. Вот пример объявле ния трех констант в языке C:

const float ADecimalNumber = 3.14;

const int i = 10;

const char * ErrorString = "Danger, Danger, Danger!";

Основное отличие между константами в языках  C и Object  Pascal  заключается в том,  что  в Object  Pascal (как  и в Visual Basic) не требуется указывать  тип  константы. Компилятор Delphi автоматически выделяет необходимую память, основываясь на инициализирующем значении (а в случае скалярных констант, таких  как целое  значе ние, он просто подставляет его в нужные места в программе, совсем не выделяя памя ти). Объявления тех же констант в Object  Pascal выглядят следующим образом:

const

ADecimalNumber = 3.14;

i = 10;

ErrorString = ‘Danger, Danger, Danger!';НА ЗАМЕТКУ

Выделение памяти для констант происходит так: целые значения размещаются в наи- меньшей, но достаточной для этого области памяти (в частности, значение 10 будет раз- мещено    как    переменная    типа    ShortInt,    32000 —    как    SmallInt и    т.д.). Алфавитно-цифровые значения, а попросту — строки, размещаются как тип Char или те- кущий тип String, определенный директивой $H. Значения с плавающей точкой разме- щаются как данные типа extended, кроме значений, имеющих менее четырех десятич- ных знаков, — в этом случае используется тип Comp. Массивы целых (Integer) или сим- вольных (Char) данных хранятся в собственном представлении.

Хоть это и необязательно, но в объявлении константы можно  указать ее тип.  Это позволит компилятору осуществлять полный контроль типов  данных  при работе с та кими константами:

const

ADecimalNumber: Double = 3.14;

I: Integer = 10;

ErrorString: string = ‘Danger, Danger, Danger!';

Object Pascal  допускает  применение в объявлениях констант (const) и перемен ных (var) функций, вычисляемых во время  компиляции. К этим функциям относятся: Ord(), Chr(), Trunc(), Round(), High(), Low() и SizeOf(). Так, все объявления в следующем примере абсолютно корректны:

type

A = array[1..2] of Integer;

const

w: Word = SizeOf(Byte);

var

i: Integer = 8;

j: SmallInt = Ord(‘a’);

L: Longint = Trunc(3.14159);

x: ShortInt = Round(2.71828);

B1: Byte = High(A);

B2: Byte = Low(A);

C: char = Chr(46);

CОВЕТ

Поведение   констант   в   32-битовом   Delphi   отличается   от   16-битового   Delphi 1.0. В Delphi 1.0 константа рассматривалась как предварительно инициализированная пере- менная, называемая типизированной константой. Начиная с Delphi 2.0, константы стали истинными константами, а для обратной совместимости была введена директива компиля- тора $J. Для совместимости с кодом Delphi 1 этот режим по умолчанию включен, но, чтобы избавиться от устаревших типизированных констант, рекомендуется отключать его (флажок Assignable typed constants (Присваиваемые типизированные константы), расположенный во вкладке Compiler окна Project Options).Если попробовать присвоить константе значение, то компилятор выдаст сооб щение  об ошибке, поясняющее, что  значение константы не может  быть  изменено. Исходя из  того  факта, что  константы доступны   только   для  чтения, компилятор Object Pascal оптимизирует использование памяти, располагая константы в неза полненных частях  страниц кода.  Более подробная информация по этой  теме  при ведена  в предыдущем издании — “Delphi 5. Руководство разработчика,  том 1”, в главе  3, “Win32 API”.

НА ЗАМЕТКУ

Object Pascal не имеет препроцессора, как C или C++. Таким образом, в Object Pascal

отсутствует концепция макросов, а значит — и эквивалент директивы препроцессора

#define, используемой в C для описания констант. Хотя язык Object Pascal и позво-

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

$define, но ее нельзя применять для определения констант, как в C. Там, где в языке С применялась директива #define, в языке Object Pascal рекомендуется объявлять константы (const).

Операторы

Оператор — это один  или  несколько символов кода,  с помощью которых выполня ются  определенные действия с данными различных типов.  Простейшим примером могут служить  операторы сложения, вычитания, умножения и деления арифметиче ских типов  данных;  другим примером может  быть оператор для доступа к определен ному элементу  массива.  В данном  разделе рассматриваются операторы Object Pascal и их отличие от операторов Java, C и Visual Basic.

Оператор присвоения

Это один из наиболее часто  используемых операторов. Оператор присвоения языка Object  Pascal (:=), аналогичный оператору = в языках  Java, C и Visual Basic, применяется для присвоения значения переменной. Иногда программисты называют его  операто ром возвращения значения (get). Рассмотрим пример оператора присвоения:

Number1 := 5;

Эту строку  можно  прочитать как “переменная Number получает значение 5” либо как “переменной Number присвоено значение 5”.

Операторы сравнения

Для тех, кто работал с Visual Basic, использование операторов сравнения в Object Pascal не вызовет никаких проблем, так как они  идентичны соответствующим опера торам  Visual Basic.

Object Pascal  использует оператор = для логического сравнения двух выражений или значений. В языках  Java и C ему аналогичен оператор ==, пример применения ко торого показан ниже.

if (x == y)На языке  Object  Pascal этот же оператор будет выглядеть следующим образом:

if x = y

НА ЗАМЕТКУ

Запомните: в Object Pascal оператор = используется только для сравнения. Чтобы присвоить значение, следует воспользоваться оператором :=.

В Delphi оператор “не равно” выглядит так: <>. В языке  C ему аналогичен оператор

!=. Вот пример проверки того, что два значения не равны  друг другу:

if x <> y thenDoSomething

Логические операторы

Object Pascal использует ключевые слова and и or в качестве логических операторов

“и” и “или” (в языках  C и Java для этого  применяются соответственно операторы && и

||). В основном эти  операторы применяются как элементы оператора if или  цикла.

Например:

if (Condition 1) and (Condition 2) then

DoSomething;

while (Condition 1) or (Condition 2) do

DoSomething;

Оператор “не” в Object Pascal выглядит как not (он аналогичен оператору ! в язы ках Java и C). В основном оператор not применяется в составе  оператора if; это  де монстрирует следующий пример:

if not (condition) then (do something); // Если условие condition

// ложно, то выполнить

// оператор do something

В табл. 2.1 приведен список операторов Object Pascal и соответствующие им опе

раторы языков Java, C и Visual Basic.

Таблица 2.1. Операторы присвоения, сравнения и логические

Оператор

Pascal

Java/C

Visual Basic

Присвоение

:=

=

=

Сравнение

=

==

= или Is*

Неравенство

<> 

!=

<> 

Меньше,  чем

Больше, чем

Меньше или равно

<=

<=

<=

Больше  или равно

>=

>=

>=

Окончание табл. 2.1

Оператор

Pascal

Java/C

Visual Basic

Логическое И Логическое ИЛИ

Логическое НЕ

and or

not

&&

||

!

And

Or

Not

* Оператор сравнения Is используется только для объектов, а оператор сравнения = применяется для всех остальных типов данных.

Арифметические операторы

Большинство арифметических  операторов  Object Pascal  должно   быть  знакомо всем,  так  как  они  идентичны операторам,  используемым в языках  Java, C,  и  Visual Basic. В табл. 2.2 приведены арифметические операторы Object  Pascal и соответст вующие им операторы языков Java, C и Visual Basic.

Таблица 2.2. Арифметические операторы

Оператор

Pascal

Java/C

Visual Basic

Сложение

+

+

+

Вычитание

-

-

-

Умножение

*

*

*

Деление с плавающей точкой

/

/

/

Деление целых чисел

div

/

\

Деление по модулю

mod

%

Mod

Возведение в степень

Отсутствует

Отсутствует

^

Как видно  из таблицы, Object  Pascal отличается от других языков программиро вания  тем,  что  в нем существуют разные операторы для деления целых  чисел  и чи сел с плавающей точкой. Оператор div автоматически отсекает остаток при  деле нии двух целых  выражений.

НА ЗАМЕТКУ

Не забывайте использовать правильный оператор деления для соответствующих ти- пов выражений. Компилятор выдаст сообщение об ошибке при попытке деления двух чисел с плавающей точкой с помощью оператора div или двух целых чисел с помо- щью оператора /, например:

var

i: Integer;

r: Real;

begin

i := 4 / 3;                 // Эта строка приведет к ошибке компиляции

f := 3.4 div 2.3;           // Эта строка тоже приведет к ошибке

end;В большинстве других языков программирования не делается различия между деле- нием целочисленным и делением с плавающей точкой. Как правило, всегда выполня- ется деление с плавающей точкой, а, при необходимости, результат конвертируется в целое число. Но при таком подходе возможно существенное снижение производитель- ности программы. Специализация оператора div языка Pascal несколько выше, а по- тому и выполняется быстрее.

Побитовые операторы

Побитовыми называются операторы, позволяющие работать с отдельными битами заданной переменной. Чаще  всего  побитовые операторы используются для сдвига  би тов влево  или вправо, их инверсии, а также  побитовых операций “и”, “или” и “исключающее или”  (xor)  между двумя числами. Операторы сдвига  влево  и вправо в Object  Pascal имеют вид shl и shr соответственно, они аналогичны операторам << и >> в языках  Java и C. Запомнить остальные операторы тоже  достаточно легко — это  not, and, or и xor. В табл. 2.3 приведены побитовые операторы и соответствующие им опе раторы языков C и Visual Basic.

Таблица 2.3. Побитовые операторы

Оператор

Pascal

Java/C

Visual Basic

И

and

&

And

Не

not

~

Not

Или

or

|

Or

Исключающее или

xor

^

Xor

Сдвиг влево

shl

<< 

Нет

Сдвиг вправо

shr

>> 

Нет

Процедуры инкремента (приращения)

и декремента

Процедуры инкремента и декремента генерируют оптимизированный код для до бавления или вычитания единицы из целой  переменной. Object  Pascal не предостав ляет  таких  широких возможностей, как постфиксные и префиксные операторы ++ и

– в языках  Java и C. Тем не менее, процедуры Inc() и Dec() обычно компилируются

в одну команду процессора.

Процедуры Inc() и Dec() можно  вызывать и с одним,  и с двумя параметрами. Ниже  приведен пример их вызова  с одним параметром.

Inc(variable); Dec(variable);

Эти  операторы будут скомпилированы в  ассемблерные инструкции add и  sub. Ниже  приведен пример вызова  таких  процедур с двумя параметрами. Здесь  перемен ная variable увеличивается, а затем уменьшается на 3:Inc(variable, 3); Dec(variable, 3);

В табл. 2.4 приведены данные  об операторах инкремента и декремента в разных языках программирования.

НА ЗАМЕТКУ

Если для компилятора установлен режим оптимизации, то процедуры Inc() и Dec()

обычно порождают такой же машинный код, что и выражения variable:=variable +

1. Поэтому для увеличения или уменьшения значения целой переменной можно исполь-

зовать тот вариант записи, который покажется более удобным.

Таблица 2.4. Операторы инкремента и декремента

Operator

Pascal

Java/C

Visual Basic

Инкремент

Декремент

Inc()

Dec()

++

Нет

Нет

Операторы присвоения с действием

Весьма удобные операторы присвоения с действием (do and assign operator), присущие языкам  Java и C, в языке  Object Pascal отсутствуют.  Это такие  операторы, как присвое ние  с суммой  += и присвоение с умножением *=. Они  выполняют арифметическую операцию (в данном  случае сложение и умножение) перед  операцией присвоения. В Object  Pascal, этот тип операций следует выполнять, используя два разных оператора. Например, следующий код C

x += 5;

на языке  Object  Pascal выглядит так.

x := x + 5;

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии