Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

2.2.7. Операция преобразования типов

Имеется возможность заставить выражение принять определенный тип с помощью операции преобразования типов. Эта операция имеет следующий вид:

(тип) выражение

где тип – это один из стандартных типов данных Си или определённый пользователем тип. Например, если необходимо, чтобы выражение х / 2 имело тип float (остаток сохранится), следует написать:

(float) x / 2

Операция преобразования типов – это унарный оператор.

Хотя принудительные преобразования редко используются при программировании на Си, бывают случаи, когда они просто необходимы. Например, необходимо использовать целое число для управления циклом и, кроме этого, требуется вычислять дробную часть от деления этого числа на какое-либо другое, как в следующем примере:

#include <stdio.h>

// выводит i и i/2 с дробной частью

void main()

{

int i;

for (i = 1; i <= 100; ++i)

printf(“%d / 2 is: %f\n”, i, (float) i/2);

return 0;

}

Без принудительного преобразования (float) будет вычисляться только целая часть, а благодаря (float) получим также и дробную часть.

2.2.8. Приоритеты в языке Си

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

Таблица 2.3. содержит перечень всех операций языка Си, упорядоченных в порядке убывания приоритета (горизонтальная черта отделяет операции с одинаковым приоритетом). В пределах своего приоритета операции выполняются справа налево или слева направо. Например, выражение 10 / 2 * 4 будет равно 20, т. к. сначала выполняется операция деления, затем операция умножения.

Таблица 2.3. Приоритеты операций

Название

Символ операции

Порядок выполнения

Обращение к функции

Выделение элемента массива

Выделение поля структурной переменной

Выделение поля структурной переменной по указателю на её начало

()

[]

.

–>

Слева направо

Логическое отрицание

Поразрядное логическое НЕ

Изменение знака (унарный минус)

Инкремент

Декремент

Определение адреса переменной

Обращение к памяти по значению указателя

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

Определение размера в байтах

!

~

++

––

&

*

(type)

sizeof

Справа налево

Умножение

Деление

Определение остатка целого деления

*

/

%

Слева направо

Сложение

Вычитание

+

Слева направо

Сдвиг влево

Сдвиг вправо

<<

>>

Слева направо

Меньше

Меньше или равно

Больше

Больше или равно

<

<=

>

>=

Слева направо

Равно

Не равно

==

!=

Слева направо

Поразрядное логическое И

&

Слева направо

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

^

Слева направо

Поразрядное логическое ИЛИ

|

Слева направо

Логическое И

&&

Слева направо

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

||

Слева направо

Операция условия

?:

Справа налево

Присваивание

= += –=

*= /= %=

<<= >>=

|= ^=

&=

Справа налево

Операция «запятая»

,

Слева направо

Заметим, что приоритеты побитовых операторов &, ^ и | ниже, чем приоритет == и !=, из-за чего в побитовых проверках типа

if ((x & y) == 0),

чтобы получить правильный результат сравнения x & y с 0, необходимо использовать скобки. Использование дополнительных круглых скобок не вызовет ошибок и не уменьшит скорость вычисления выражения.

if ((a = b) == с)

В этом примере сначала значение b присваивается операнду а, затем значение с сравнивается с полученным значением операнда а.

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

x=y/3-34*temp&127;

или

x = (у / 3) – ((34 * temp) & 127);