Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Фрагменты стандарта языка Си
Классификация типов типы::= типы_данных | функциональные_типы | неполные_типы
типы_данных::= скалярные_типы | нескалярные_типы скалярные_типы::= арифметические типы | указатели арифметические_типы::= целочисленные_типы | плавающие_типы целочисленные_типы::= 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 с.) |