Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Системне програмування.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
74.23 Кб
Скачать

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

При выполнении арифметических операций или операции присваивания переменные и константы, участвующие в этих операциях могут быть разных типов, например в следующей последовательности операторов:

double y;

float x;

y = x + 5;

суммируются переменная x, имеющая тип float и константа целого типа -5, а результат суммирования присваивается переменной y типа double.

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

Для арифметических операций при этом действуют следующие правила:

  1. Типы char и short преобразуются в int.

  2. Тип float преобразуется в double.

  3. Если один из операндов имеет тип double, то другой преобразуется в double, и результат имеет тип double.

  4. Если один из операндов имеет тип long, то другой преобразуется в long, и результат имеет тип long.

  5. Если один из операндов имеет тип unsigned, то другой преобразуется в unsigned и результат имеет тип unsigned.

При присваивании значение правой части преобразуется к типу левой. Этот тип и является типом результата. При этом преобразование происходит по следующим правилам:

  1. Символьные переменные преобразуются в целые либо со знаковым расширением, либо без него, как указано выше. При обратном преобразовании int в char старшие биты просто отбрасываются.

  2. Типы float и double преобразуются в int отбрасыванием дробной части и округлением (для double). При обратном преобразовании сначала происходит преобразование в тип long, а затем преобразование к плавающему типу (возможно с потерей точности).

  3. Тип double преобразуется во float с помощью округления. Обратное преобразование происходит без потери точности.

  4. Длинные целые преобразуются в более короткие целые и в переменные типа char посредством отбрасывания старших битов. При обратном преобразовании данные дополняются нулями слева.

  5. При преобразовании типа unsigned в тип signed старший бит рассматривается как знаковый, а при обратном преобразовании старший бит рассматривается как часть числа.

Помимо перечисленных выше преобразований, называемых неявными преобразованиями типа (поскольку они автоматически выполняются компилятором без вмешательства программиста), в C можно задать явное преобразование типа с помощью следующей операции:

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

где выражение преобразуется к указанному типу по правилам преобразования, которые изложенным выше и присваивается некоторой фиктивной переменной указанного типа, которая затем используется вместо всего выражения. Приоритет выполнение этой операции ниже, чем присвоение знака числу, но выше, чем у арифметических операций. Например, (int) (3.8 + 5) преобразует сумму константы 3.8 типа double и 5 типа int в выражение целого типа (скобки необходимы, поскольку приоритет операции преобразования типа выше, чем у операции сложения).

3.2.10. Операции отношения и логические операции

Операции отношения сравнивают первый операнд со вторым. Операции отношения в C приведены в табл. 3.2.10.

Табл. 3.2.10. Операции отношения языка C

Операция

Проверяемое соотношение

Операция

Проверяемое соотношение

<

первый операнд меньше второго

>=

первый операнд больше или равен второму

>

первый операнд больше второго

==

первый операнд равен второму

<=

первый операнд меньше или равен второму

!=

первый операнд не равен второму

Результатом операции сравнения может быть либо «истина», (например, утверждение 5 > 3 является истиной), либо «ложь» (например, утверждение 5==3 является ложью). В языке C нет логического типа данных, и результат сравнения имеет тип int. Если результат сравнения является ложным, то ему присваивается значение 0, иначе – 1. В C любое число или выражение, имеющее тип int, может трактоваться как логическое значение, при этом значение 0 трактуется как ложь, а все остальные значения трактуются как истина.

Операнды операции сравнения могут числовыми или символьными (в последнем случае сравниваются числовые коды символов). Однако необходимо иметь в виду, что при сравнении чисел с плавающей точкой можно пользоваться только операци­ями "<" и ">". Это объясняется тем, что ошибки округле­ния могут привести к тому, что числа окажутся нерав­ными, хотя по логике программы они должны быть равными. Например, вполне очевидно, что произведение чисел 3 и 1.0/3.0 равно 1.0. Но если представить 1.0/3.0 в виде десятичной дроби с шестью значащими цифрами, то про­изведение будет равно 0.999999, что не равняется в точ­ности 1.

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

Приоритет операций отношения ниже, чем арифметических операций. Среди операций отношения операции ">", "<", ">=" и "<=" имеют более высокий приоритет, чем операции "==" и "!=".

Примеры операций отношения:

1. value1 < value2

2. i == j

3. j != k

4. 'a' >'c' – сравниваются коды символов (результат будет равен 0, т.к. код символа 'a' меньше кода символа 'c').

Логические операции выполняют над своими операндами логические функции И, ИЛИ и НЕ. Результат логической операции так же, как и операции отношения, имеет тип int и имеет значение 1 для логического значения «истина» и 0 – для логического значения «ложь».

Операция НЕ (отрицание) обозначается в C символом восклицательный знак – "!". Эта операция выполняется над одним операндом. Результатом выполнения операция отрицания будет 1, если операнд имеет значение «ложь» (равен 0) и 0, если операнд имеет значение «истина» (ненулевое значение).

Операции И и ИЛИ выполняются над двумя операндами.

Операция И (логическое умножение) обозначается с помощью двух символов амперсанта – "&&". Результат этой операции равен 1 только в том случае, если оба операнда имеют ненулевое значение, в остальных случаях результат операции равен 0.

Операция ИЛИ (логическое сложение) обозначается с помощью двух символов вертикальной черты – "||". Операция вырабатывает значение 1, если хотя бы один из операндов имеет ненулевое значение и 0 – в противном случае. Типы первого и второго операнда могут отличаться. Логические операции вычисляют операнды и сравнивают их с нулем.

Операция "!" (НЕ) имеет тот же приоритет, что и операции инкремента "++" и декремента "--", т.е. выше, чем у арифметических операций. Приоритет операций И ("&&") и ИЛИ ("||") ниже, чем приоритет операций отношения, причем приоритет операции И ("&&") как логического умножения выше, чем приоритет операции ИЛИ ("||") как логического сложения. Изменение приоритета выполнения операций, как и в арифметических выражениях, производится с помощью скобок.

Примеры логических операций:

  1. value1 < 1 && value1 > 0 /* 0<value1<1 */

  2. value1 >0 && value2 > 0 || max_value != 0 /* «истина», если либо value1>0 и value2>0, либо max_value¹0 */

  3. value1 >0 && (value2 > 0 OR max_value != 0) /* «истина», если value1>0 и либо value2>0, либо max_value¹0 */