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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

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

 

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

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

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

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

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

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

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

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

 

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

 

 

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

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

() [ ] ®. постфиксные ++ и - -слева направо (®)

 

! ~ префиксные ++ и - - унарные + - * & ( тип ) 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.

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

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

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

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

n при выполнении операций 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).

2. если после выполнения п.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 Арифметические преобразования при выполнении присваивания и явного приведения

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 212; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.123.32 (0.008 с.)