Flatik.ru

Перейти на главную страницу

Поиск по ключевым словам:

страница 1 ... страница 9страница 10страница 11страница 12страница 13

10.2 Фрагменты стандарта языка Си

10.2.1 Классификация типов

типы ::= типы_данных | функциональные_типы | неполные_типы


типы_данных ::= скалярные_типы | нескалярные_типы

скалярные_типы ::= арифметические типы | указатели

арифметические_типы ::= целочисленные_типы | плавающие_типы

целочисленные_типы ::= char| signed char | unsigned char | short | unsigned short | int | unsigned int | long | unsigned long | перечислимые типы | поля_битов

плавающие_типы ::= float | double | long double

указатели ::= указатели_на_данные | указатели_на_функции | указатели_на_неполные_типы

нескалярные_типы ::= структуры | массивы | объединения

неполные_типы ::= неполные_структуры | неполные_массивы | неполные_объединения | void



10.2.2 Приоритеты и порядок выполнения операций




операции выполняются

----------------------------------------------------------------------------------------------------------------



( ) [ ] . постфиксные ++ и - - слева направо ( )
! ~ префиксные ++ и - - унарные + - & (тип) sizeof справа налево ( )
/ % слева направо ( )
+ слева направо ( )
<< >> слева направо ( )
< <= > >= слева направо ( )
== != слева направо ( )
& слева направо ( )
^ слева направо ( )
| слева направо ( )
&& слева направо ( )
|| слева направо ( )
? : справа налево ( )
= += = = /= %= &= ^= |= <<= >>= справа налево ( )
, слева направо ( )
Несмотря на строго определенный приоритет операций, при вычислении выражения существует некоторая свобода в выборе порядка вычисления его подвыражений.

Например, y = *p++; может быть вычислено как

temp = p; p += 1; y = *temp; либо как

y = *p; p += 1;

Порядок вычислений важен для понимания того, когда проявляется побочный эффект. Побочный эффект при вычислении выражения - это занесение в память значений объектов, изменение состояния файла либо доступ к volatile - объектам.

Точка последовательных вычислений ( sequence point ) - это точка в программе, где можно точно определить, какие из побочных эффектов уже проявились, а какие - еще нет.

Если выражение является частью оператора, то точкой, где заведомо выполнились все побочные эффекты его вычисления - это конец этого оператора. Например, в y = 37; x += y; можно быть уверенным, что 37 будет занесено в y раньше, чем значение y будет извлечено из памяти при вычислении суммы x + y.

Кроме того, точки последовательных вычислений могут быть расположены внутри самого выражения:



  • при выполнении операции x , y такая точка находится между вычислением x и y;

  • при выполнении операции z ? x : y такая точка находится между вычислением z и вычислением x либо y;

  • при вызове функции все побочные эффекты вычисления значений ее аргументов проявятся перед выполнением ее тела;

  • при выполнении операций x && y и x || y такая точка находится между вычислением x и вычислением y.

Например, в if ( ( c = getchar() ) != EOF && isprint(c) ) вызов функции isprint(c) произойдет только после того, как переменная c получит новое значение.

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

Например, верно val = 10 * val + (c - ‘0’); но неверно i = ++i + 2;

Выражение может содержать точки последовательных вычислений, и тем не менее, порядок вычислений не будет однозначным. Например, f(x) + g(x) содержит такие точки, однако операция + допускает произвольный порядок вычисления ее операндов.



10.2.3 Арифметические преобразования при выполнении арифметических операций вида X op Y

1. если есть операнд типа short или signed char, то он преобразуется к int; если есть операнд типа char, unsigned char или unsigned short, и все значения этого типа могут быть представлены как int, то он преобразуется к int; иначе - к unsigned int. Это преобразование называется «целочисленное расширение» (promoting ).



  1. если после выполнения п.1 операнды имеют различные типы, то осуществляется их приведение к общему типу. Общим для двух типов ( кроме случая «unsigned int - long» ) является тот, который расположен позже в последовательности int, unsigned int, long, unsigned long, float, double, long double.

Если операнды имеют типы unsigned int и long, и все значения типа unsigned int могут быть представлены как long, то общим типом является long; иначе - unsigned long. Это преобразование называют «согласование типов» (balansing).

3. после этого выполняется арифметическая операция; тип результата - это тип, к которому были приведены оба операнда.




10.2.4 Арифметические преобразования при выполнении присваивания и явного приведения



M-битового представления величины X к N-битовому представлению

преобразование N < M N == M N>M

-------------------------------------------------------------------------------------------------------

знаковое целое отсечение значение значение

к старших сохраняется сохраняется

знаковому целому N-M бит

-------------------------------------------------------------------------------------------------------------

беззнаковое целое зависит от если x 0,знач.сохр. значение

к реализации иначе зависит от сохраняется

знаковому целому реализации

-------------------------------------------------------------------------------------------------------------

вещественное если |x|<2N-1,то если |x|<2N-1,то если |x|<2N-1,то

к trunc(x) trunc(x) trunc(x)

знаковому целому иначе зависит иначе зависит иначе зависит

от реализации от реализации от реализации

------------------------------------------------------------------------------------------------------------

знаковое целое если x0, то x%2N если x0 если x0

к иначе зависит знач. сохр. знач. сохр.

беззнаковому целому от реализации иначе x+2N иначе x+2N

-------------------------------------------------------------------------------------------------------------

беззнаковое целое значение значение

к x%2N сохраняется сохраняется

беззнаковому целому

------------------------------------------------------------------------------------------------------------

вещественное если 0x<2N если 0x<2N если 0x<2N

к trunc(x) trunc(x) trunc(x)

беззнаковому иначе зависит иначе зависит иначе зависит

целому от реализации от реализации от реализации

------------------------------------------------------------------------------------------------------------

знаковое целое сохр. знак, значение значение

к сохр. старшие сохраняется сохраняется

вещественному N-1 бит

------------------------------------------------------------------------------------------------------------

беззнаковое целое знак +, знак +, значение

к сохр. старшие сохр. старшие сохраняется

вещественному N-1 бит N-1 бит

------------------------------------------------------------------------------------------------------------

вещественное сохр. старшие значение значение

к N-1 бит сохраняется сохраняется

вещественному



10.2.5 Неявное приведение типов в операторе присваивания X = Y




тип X тип Y тип результата

-------------------------------------------------------------------------------------------------------------

арифметический арифметический тип X

-------------------------------------------------------------------------------------------------------------

указатель, структура тип X тип X

либо объединение

-------------------------------------------------------------------------------------------------------------

указатель на const T указатель на T либо тип X

на const T

-------------------------------------------------------------------------------------------------------------

указатель на volatile T указатель на T либо тип X

на volatile T

-------------------------------------------------------------------------------------------------------------

указатель на const volatile T указатель на T, либо на тип X

const T, либо на volatile T,

либо на const volatile T

-------------------------------------------------------------------------------------------------------------

указатель на void указатель на T тип X

-------------------------------------------------------------------------------------------------------------

указатель на T указатель на void тип X

-------------------------------------------------------------------------------------------------------------

указатель на T целое значение 0 тип X




10.2.6 Явное приведение ( тип Т ) X




тип X тип Т тип результата
-------------------------------------------------------------------------------------------------------------

скалярный целочисленный тип Т

-------------------------------------------------------------------------------------------------------------

арифметический плавающий тип Т

-------------------------------------------------------------------------------------------------------------

целочисленный указатель на любой тип тип Т

-------------------------------------------------------------------------------------------------------------

указатель на T1 указатель на T2 тип Т

-------------------------------------------------------------------------------------------------------------

указатель на функцию указатель на функцию тип Т

-------------------------------------------------------------------------------------------------------------

скалярный void void



10.2.7 Адресная арифметика



операция тип X тип Y тип результата
-------------------------------------------------------------------------------------------------------------

X+Y указатель_на_данные целочисленный тип X

-------------------------------------------------------------------------------------------------------------

X+Y целочисленный указатель_на_данные тип X

-------------------------------------------------------------------------------------------------------------

X+=Y указатель_на_данные целочисленный тип X

-------------------------------------------------------------------------------------------------------------

XY указатель_на_данные целочисленный тип X

-------------------------------------------------------------------------------------------------------------

XY указатель_на_данные указатель_на_данные ptrdiff_t

-------------------------------------------------------------------------------------------------------------

X=Y указатель_на_данные целочисленный тип X

-------------------------------------------------------------------------------------------------------------

X&&Y; указатель указатель int

-------------------------------------------------------------------------------------------------------------

! X указатель int

-------------------------------------------------------------------------------------------------------------

X || Y указатель указатель int

-------------------------------------------------------------------------------------------------------------

X++ указатель указатель

-------------------------------------------------------------------------------------------------------------

X указатель указатель

-------------------------------------------------------------------------------------------------------------

++X указатель указатель

-------------------------------------------------------------------------------------------------------------

X указатель указатель

-------------------------------------------------------------------------------------------------------------



sizeof X указатель size_t

-------------------------------------------------------------------------------------------------------------

X Y указатель на Т целочисленный тип Т

-------------------------------------------------------------------------------------------------------------

X Y целочисленный указатель на Т тип Т

-------------------------------------------------------------------------------------------------------------

X Y указатель на структуру имя поля этой тип поля Y

или объединение структуры или

объединения

-------------------------------------------------------------------------------------------------------------

X указатель_на_данные типа Т тип Т

-------------------------------------------------------------------------------------------------------------

X указатель_на_функцию типа Т тип Т

-------------------------------------------------------------------------------------------------------------

X указатель_на void void


<предыдущая страница | следующая страница>


Учебное пособие для студентов II курса Москва 1999

Представлены задачи и упражнения по языку Си и программированию на нем. Рассматриваемая версия Си соответствует международному и ansi-стандарту этого языка

1074.47kb.

08 10 2014
13 стр.


Учебное пособие Москва Издательство Российского университета дружбы народов 1999 Утвержден о рис ученого совета

К 46 Гигиена труда и профилактика профессиональных заболеваний в отдельных отраслях промышленности: Учеб пособие. М.: Изд-во рудн, 1999. 95 с

1763.61kb.

11 09 2014
7 стр.


Учебное пособие для старших классов мирос москва 1999 Еськов К. Ю. История Земли и жизни на ней: Экспериментальное учебное пособие для старших классов. М.: Мирос, 1999 с.: ил

История Земли и жизни на ней: Экспериментальное учебное пособие для старших классов. – М.: Мирос, 1999 – с.: ил

3595.22kb.

15 09 2014
22 стр.


Учебное пособие для студентов экономических специальностей Павлодар (075. 8) Ббк 65. 290 2 я 73 с 50

Учебное пособие предназначено для изучения курса «Управление рисками» студентами экономических специальностей вузов

1528.71kb.

16 12 2014
8 стр.


Учебное пособие Для студентов факультета журналистики Москва

П 54 Международное гуманитарное право и средства массовой информации: Учеб пособие. — М.: Импэ им. А. С. Грибоедова, 2003. — 40 с

738.43kb.

06 10 2014
3 стр.


Учебное пособие по части курса «Вычислительные системы, сети и телекоммуникации» для студентов специальности 080801

Попов, Ф. А. Вычислительные машины: общие принципы построения и архитектуры: учебное пособие по части курса «Вычислительные системы, сети и телекоммуникации» для студентов специаль

1448.13kb.

24 09 2014
6 стр.


Учебное пособие для студентов высших и средних специальных учебных заведений / Пер с англ. В. Н. Егорова. 2-е изд. М.: Юнити, 2002. 595 с. 13 экз

Вяткин Л. А. Туризм и спортивное ориентирование: Учебное пособие для студентов вузов. – М.: Academia, 2001. – 208 с. 11 экз

60.92kb.

14 10 2014
1 стр.


Учебное пособие для студентов специальности 240706 «Автоматизированное производство химических предприятий»

Учебное пособие предназначено для студентов очной и очно-заочной форм обучения специальности 240706, изучающих дисциплину «Машины и агрегаты для переработки и изготовления смесей»

484.57kb.

09 09 2014
4 стр.