
- •3.2.4. Алфавит языка c, идентификаторы, ключевые слова, комментарии
- •3.2.5. Константы в c
- •3.2.6. Типы переменных в языке c и их объявление
- •3.2.7. Объявление простых переменных
- •3.2.8. Арифметические операторы и операторы присваивания
- •3.2.9. Преобразования типов
- •3.2.10. Операции отношения и логические операции
- •3.2.11. Условная операция
- •3.2.12. Стандартная библиотека языка c
- •3.2.13. Математические функции c
- •3.2.14. Форматированный вывод данных в c
- •3.2.15. Структура программы на языке c
3.2.9. Преобразования типов
При выполнении арифметических операций или операции присваивания переменные и константы, участвующие в этих операциях могут быть разных типов, например в следующей последовательности операторов:
double y;
float x;
y = x + 5;
суммируются переменная x, имеющая тип float и константа целого типа -5, а результат суммирования присваивается переменной y типа double.
В таких случаях в C перед выполнением операций происходит преобразование операндов из одного типа в другой.
Для арифметических операций при этом действуют следующие правила:
Типы char и short преобразуются в int.
Тип float преобразуется в double.
Если один из операндов имеет тип double, то другой преобразуется в double, и результат имеет тип double.
Если один из операндов имеет тип long, то другой преобразуется в long, и результат имеет тип long.
Если один из операндов имеет тип unsigned, то другой преобразуется в unsigned и результат имеет тип unsigned.
При присваивании значение правой части преобразуется к типу левой. Этот тип и является типом результата. При этом преобразование происходит по следующим правилам:
Символьные переменные преобразуются в целые либо со знаковым расширением, либо без него, как указано выше. При обратном преобразовании int в char старшие биты просто отбрасываются.
Типы float и double преобразуются в int отбрасыванием дробной части и округлением (для double). При обратном преобразовании сначала происходит преобразование в тип long, а затем преобразование к плавающему типу (возможно с потерей точности).
Тип double преобразуется во float с помощью округления. Обратное преобразование происходит без потери точности.
Длинные целые преобразуются в более короткие целые и в переменные типа char посредством отбрасывания старших битов. При обратном преобразовании данные дополняются нулями слева.
При преобразовании типа 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 – в противном случае. Типы первого и второго операнда могут отличаться. Логические операции вычисляют операнды и сравнивают их с нулем.
Операция "!" (НЕ) имеет тот же приоритет, что и операции инкремента "++" и декремента "--", т.е. выше, чем у арифметических операций. Приоритет операций И ("&&") и ИЛИ ("||") ниже, чем приоритет операций отношения, причем приоритет операции И ("&&") как логического умножения выше, чем приоритет операции ИЛИ ("||") как логического сложения. Изменение приоритета выполнения операций, как и в арифметических выражениях, производится с помощью скобок.
Примеры логических операций:
value1 < 1 && value1 > 0 /* 0<value1<1 */
value1 >0 && value2 > 0 || max_value != 0 /* «истина», если либо value1>0 и value2>0, либо max_value¹0 */
value1 >0 && (value2 > 0 OR max_value != 0) /* «истина», если value1>0 и либо value2>0, либо max_value¹0 */