 |
Приведение типов.
-----------------------------------------------------------------
Паскаль, как правило, позволяет использовать только ограни-
чение типов. Функция Ord() переводит из любого порядкового (пере-
числимого) типа в Integer; Chr() переведит из Integer (или родс-
твенных типов) в Char. Турбо Паскаль допускает некоторые добавоч-
ные типы при переводе (так называемое retyping) между всеми по-
рядковыми типами (Integer, Char, Boolean и переменным типам дан-
ных). Си более свободен и позволяет вам пробовать смену одного
типа на любой другой, но без гарантии благоприятного исхода.
Турбо Паскаль Турбо Си
----------------------------------------------------------------
:=(); =();
var Ch : Char; char ch;
I := Integer (Ch); i = (int) ch;
Ch := Char (Today); ch = (char) today;
Noday :=Days(3); today = (days) 3;
Добавим, что Турбо Си может сделать большинство переводов
автоматически, главным образом между типами, которые являются
Integer compatible (тип, чьи выделенные представления являются
величинами Integer). Исходя из этого, все три оператора могли бы
пропускать определенное указание типа значения выражения. Вы мог-
ли бы написать:
i=ch; ch=today; today=3;
Константы, переменные записи и инициализация.
-----------------------------------------------------------------
Турбо Паскаль не инициализирует переменные, которые вы ука-
зали. Также не сохраняет величины переменных, указанные в преде-
лах процедуры (и функции) между вызовами подпрограмм. Главное ис-
ключение - инициализируемые постоянные, они будут сохранять свои
величины между вызовами подпрограмм, в которых они определены,
- 153,154 -
включая любые величины, которые вы можете назначить им во время
выполнения.
В Си по умолчанию глобальным переменным присваивается нача-
льное значение 0, если вам не ясно, какое присвоить начальное
значение.
Турбо Си дает вам два типа констант, разрешает предваритель-
но инициализировать любую переменную, и сохраняет значения пере-
менных, объявленных внутри функции, как статические.
Типы констант.
----------------------------------------------------------------
Существуют два типа констант с форматом:
#define
const = ;
Первый тип (#define...) более точно подходит к определению
констант в Паскале, в котором (значение) прямо присваи-
вается там, где будет найдено имя константы .
Второй тип (const...) больше похож на типизированные
константы в Турбо Паскале, однако, исключает возможность изменять
значение ; любая попытка модификации или назначения новой
величины дает в итоге ошибку.
- 155,156 -
Инициализация переменных.
----------------------------------------------------------------
Турбо Си позволяет инициализировать любую переменную, кото-
рая, таким образом, совпадает с типизированной константой в Турбо
Паскале. Формат следующий:
= ;
Элементы данных, нуждающиеся более чем в одной величине
(массивы, структуры) должны иметь значения, заключенные в фигур-
ные скобки и отделенные запятыми ({like_this, and_this, and_this_
too}).
int x = 1, y = 2;
char name []="Франк";
char answer ='Y';
char key = 3;
char list[2] [10] = {"Первый", "Второй"};
Переменные памяти.
-----------------------------------------------------------------
Си определяет несколько классов памяти для переменных; два
наиболее важных - external (внешний) и automatic (local) (мест-
ный). Глобальные переменные (которые описываются вне любой функ-
ции, включая основную) являются внешними по умолчанию. Это подра-
зумевает, что им присваивается начальное значение 0 в начале
выполнения программы, если вы сами не присвоили им значения.
Переменные, указываемые в пределах функций (в том числе ос-
новной), принимаются по умолчанию automatic. Им не присваиваются
значения, если вы не сделали это, и они теряют свои величины меж-
ду вызовами этой функции. Однако вы можете указать такие перемен-
ные static; им будет присвоен 0 (сразу, в начале выполнения прог-
раммы) и они сохранят свои значения между вызовами функций.
Рассмотрим следующий пример
init test (void)
{
int i;
- 157,158 -
static int count;
...
}
Переменная i находится в стеке и может быть инициализирован-
на функцией test каждый раз, когда вызывается программа. Cтати-
ческая переменная count, c другой стороны находится в глобальной
зоне данных и инициализируется нулем, когда программа выполняется
впервые. Count сохраняет свое предыдущее значение при следующем
вызове функции test.
Динамическое распределение памяти.
-----------------------------------------------------------------
В Турбо Паскале есть несколько методов для управления кучей
(динамической областью памяти). Дадим следующее описание на Турбо
Паскале:
type
ItemType=Integer;
ItemPtr=^ItemType;
var
p : ItemPtr;
На практике используется три различных метода распределения
и освобождения динамической памяти:
(* New и Dispose*)
New(p); {Автоматическое размещение
требуемой памяти}
...
Dispose(p); {Автоматическое освобождение
задействованой памяти}
(*New, Mark и Release*)
New (p); {Автоматическое размещение
требуемой памяти}
...
Mark(p);
- 159,160 -
Release(p) {Освобождение всей динамической
памяти, начиная с p до конца кучи}
(*FreeMem и GetMem*)
GetMem(p, Sizeof(ItemType)); {Определение объема памяти
для размещения}
...
 |
|