Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИТ11зт / МУ к лабораторным работам.doc
Скачиваний:
12
Добавлен:
11.06.2015
Размер:
3.16 Mб
Скачать

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

Приоритет и ассоциативность операций влияют на порядок группирования операндов и порядок вычислений в выражениях С. Например, приоритет выполнения операций необходимо учитывать при составлении сложных арифметических формул.

Операции, приведенные в одной группе таблицы, имеют одинаковый приоритет и ассоциативность. Порядок убывания приоритета сверху вниз.

Таблица 20-Приоритет операций

Приоритет

Знак операции

Тип операции

Ассоциативность (порядок выполнения)

() [ ] .–>

Первичные

→ слева направо

~ ! * & ++ -- sizeof,приведение типов( )

Унарные

← справа налево

* / %

Мультипликативные

+ -

Аддитивные

<< >>

Сдвиги

< > <= > =

Отношение

= = ! =

Отношение

&

Поразрядное "и"

^

Поразрядное исключающее "или"

|

Поразрядное включающее "или"

&&

Логическое "и"

| |

Логическое "или"

? :

Условная (тернарная)

=

* =

/ =

% =

Простое и составное присваивание

+ =

=

<< =

>> =

& =

| =

^ =

,

Последовательное вычисление

Если несколько операций одного приоритета встречаются в выражении, то они применяются в соответствии с ассоциативностью.

Примеры. а = b&хFF + 5; // вычисляется как а = b&(х FF + 5);

b=а + с >> 1; // как b=(а +с) >> 1;

с = а + + + b/5; // как с=(а + +) + ( b/5);

Мультипликативные, аддитивные и поразрядные операции обладают свойством коммутативности. Компилятор вычисляет выражения с учётом приоритета в любом порядке, даже если есть скобки. Определённый порядок вычисления (,) операндов гарантируют операции: последовательного вычисления, логические «И» (&&) и «ИЛИ» (), условная операция (? :).

Запятые в вызовах функций не являются операциями последовательного вычисления и не обеспечивают гарантий вычисления слева направо. Логические операции вычисляют минимальное число операндов, необходимых для определения результатов выражения.

func (i + 1, i = j + 2); //. Не гарантирует порядок вычисления фактических

// аргументов

i= 0; // i имеет тип int по умолчанию

a [++ i] = i; // порядок вычисления левого и правого операндов не // гарантируются a [0] = 0 или a[1]=1

(x - 5) && ++ i // Если x =5, то ++ i не вычисляется

int x, y, z, f();

z = x > y  f(x, y); // Если x > y, то значение z = 1 «Истина», а f( ) –не

// вызывается

// если x y, то f() вызывается, тогда z=0,

// eсли f( ) возвращает нулевое значение, или z = 1,

// если f( ) возвращает не нулевое значение

// printf (“%d %d \n“, ++n, p()2, n)

// в функцию может передаваться n или n+1.

Преобразование типов

В выражениях С переменные различных типов в ряде случаев могут использоваться совместно; например, переменные типа char могут присутствовать в выражениях одновременно с переменными типа int.

Пример совместного использования целых и символьных переменных.

char ch='a', ans; //объявление переменных ch и ans

printf("значение ch + 3 = %d", ch+3); // вывод значения ch+3

ans = ch % 3; // определение остатка от целочисленного деления

printf("\n\nзначениеans = % d\n", ans);

Поскольку char это целый тип, для него применимы все операции, операнды которых могут иметь тип int. Целые по умолчанию - это величины со знаком signed.

С переменными вещественного типа (float, double и др.) применимы все операции, допустимые для целого типа int, за исключением операции остатка от деления (%).

Преобразования типов бывают явные и неявные. Синтаксис операции явного преобразования типа

Соседние файлы в папке ИТ11зт