Страница 31 из 56
тельности означает указатель на ничего). Однако, будучи объявлен-
ным, такой указатель может указывать на объект любого другого ти-
па. Турбо Си позволяет переназначать указатели, но компилятор бу-
дет предупреждать о случаях переназначения, если только предвари-
тельно этот указатель не был объявлен как указатель на тип void.
Однако, указатели на типы данных не могут быть преобразованы в
указатели на функции, и наоборот.
Арифметические преобразования (K&R 6.6)
-----------------------------------------------------------------
В K&R определяются обычные арифметические преобразования,
определяющие, что произойдет с любыми величинами, использованными
в арифметических выражениях (операнд, оператор, операнд). Здесь
приведены шаги, используемые Турбо Си, для преобразования операн-
дов в арифметических выражениях:
1. Любой не integer и не double тип преобразуется в соответс-
твии с таблицой 11.5. После этого любые два значения, объединен-
ные оператором, являются целыми - int (включая long и unsigned
модификаторы) или с плавающей точкой - double.
2. Если какой-либо операнд имеет тип double, то другой операнд
тоже преобразуется в double.
3. В случае, если один из операндов имеет тип unsigned long,
то другой операнд тоже преобразуется в unsigned long.
4. В случае, если один из операндов имеет тип long, то другой
операнд тоже преобразуется в long.
5. В случае, если какой-либо из операндов имеет тип unsigned,
то другой операнд тоже преобразуется в unsigned.
6. В последнем варианте, оба операнда являются типа int.
Результат выражения определяется типами обоих операндов.
- 253,254 -
Таблица 11.5: Методы, используемые для определения результата
в арифметических преобразованиях.
-----------------------------------------------------------------
Тип Преобразуется в Метод
-----------------------------------------------------------------
char int со знаком
unsigned char int нулевой старший байт (всегда)
signed char int со знаком (всегда)
short int если unsigned, то unsigned int
enum int тоже значение
float double мантисса дополняется нолями
-----------------------------------------------------------------
Операторы (K&R раздел 7.2)
-----------------------------------------------------------------
Турбо Си поддерживает унарный оператор + , K&R - нет. Этот
оператор неэффективен, но необходимо предвидеть симметрию с про-
тивоположным оператором. Стараясь создать эффективно компилируе-
мые выражения, Турбо Си обычно выполняет перегруппировку выраже-
ния с переупорядочиванием коммутативных операторов (таких как * и
бинарный +). Однако, Турбо Си не будет переупорядочивать выраже-
ния с плавающей точкой. То есть можете использовать скобки для
выделения одних преобразований в выражениях с плавающей точкой
перед другими. Например, если a, b, c и f имеют тип float, тогда
выражение
f = a + (b + c);
заставит сначала оценить значение (b+c), а затем прибавить
результат к a.
- 255,256 -
Спецификаторы типов и модификаторы (K&R 8.2)
-----------------------------------------------------------------
Турбо Си поддерживает следующие основные типы, отсутствующие
у K&R:
- unsigned char
- unsigned short
- unsigned long
- long double
- enumeration
- void
Типы int и short совпадают в Турбо Си; оба занимают 16 бит.
Смотрите "Hardware Specifics" (аппаратно-архитектурную специфику)
для более детального понимания о воплощении различных типов.
Тип enum
-----------------------------------------------------------------
Турбо Си поддерживает все перечислимые типы ANSI стандарта.
Перечислимый тип данных используется для описания дискретного
множества целых значений. Например, вы можете объявить следующее:
enum days { sun, mon, tues, wed, thur, fri, sat };
Имена, перечисленные в days, являются целыми константами:
первая (sun) автоматически установлена в ноль, а каждая следующая
имеет значение на единицу больше, чем предыдущая (mon = 1, tues=2
и т.д.). Однако, вы можете присвоить константам и определенные
значения; следующие имена, без конкретных значений, будут тогда,
как и раньше, иметь значения предыдущих элементов с увеличением
на единицу. Например,
enum coins {penny=1, nickle=5, dime=10, quarter=25};
Переменной перечислимого типа может быть присвоено любое
значение типа int - проверка типа не производится.
- 257,258 -
Тип void
-----------------------------------------------------------------
У K&R каждая функция возвращает значение; если тип не объяв-
лен, то функция принадлежит типу int. В Турбо Си поддерживается
тип void, определенный в ANSI стандарте. Он используется для яв-
ного описания функций, не возвращающих значений. Аналогично, пус-
той список параметров может быть объявлен зарезервированным сло-
вом void. Например,
void putmsg(void)
{
printf("Hello, world\n");
}
main()
{
putmsg();
}
Вы можете преобразовывать выражение к типу void, для того
чтобы явно указать, что значение, возвращаемое функцией, игнори-
руется. Например, если вы хотите приостановить выполнение прог-
раммы до тех пор пока пользователь не нажмет какую-либо клавишу,
то можете написать:
(void) getch();
Наконец, вы можете объявить указатель на объект типа void.
Данный указатель не будет указателем на ничто; а будет указателем
на любой тип данных, причем конкретный тип этих данных знать нео-
бязательно. Вы можете присваивать любой указатель указателю типа
void (и наоборот) без приведения типов. Однако вы не можете ис-
пользовать оператор косвенной адресации (*) с указателем void, т.
к. используемый тип неопределен.
- 259,260 -
Модификатор signed
-----------------------------------------------------------------
Кроме указанных у K&R трех типов модификаторов - long, short
и unsigned - Турбо Си поддерживает еще три: signed, const и
volatile (все определены в ANSI стандарте).