Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
13
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

Значения логических выражений

Отношения типа i > j и логические выражения, содержащие операторы &&, ||, ! определяют выражение, которое имеет значение 1, если оно истинно и 0, если ложно. После присваивания

d = c>= ’0’ && c <= ’9’;

d будет иметь значение 1, если c – цифра и 0 в противном случае. Однако функции, подобные isdigit, могут выдавать в качестве истины любое ненулевое значение.

Арифметические преобразования

Перед выполнением оператора вроде + или * с операндами разных типов «низший тип» повышается до «высшего». Высшим считается тип с большим размером памяти. Для целых типов одного размера высшим считается беззнаковый тип по отношению к типу со знаком. Результат выражения будет иметь высший тип.

Правила преобразования следующие:

  • Если один из операндов имеет тип long double, другой тоже преобразуется к long double.

  • В противном случае, если один из операндов имеет тип double, другой тоже преобразуется в double.

  • В противном случае, если один из операндов имеет тип float, другой тоже преобразуется в float.

  • В противном случае типы char, unsigned char, signed char преобразуются к int. Это действие называется целочисленным повышением.

  • Затем, если один из операндов имеет тип unsigned long, другой тоже преобразуется к unsigned long.

  • В противном случае, если один из операндов имеет тип long int, другой unsigned int, то если long int может представить все значения типа unsigned int, то unsigned int преобразуется в long int, иначе оба операнда преобразуются к типу unsigned long int.

  • В противном случае, если один из операндов имеет тип long, другой тоже преобразуется в long.

  • В противном случае, если один из операндов имеет тип unsigned int, другой тоже преобразуется в unsigned int.

  • В противном случае оба операнда имеют тип int.

Пусть на конкретной машине int занимает 16 битов, а long – 32. В этом случает long содержит все возможные значения unsigned int, и выражение

–1L < 1U

будет истинным, так как 1U преобразуется в long и после преобразования будет иметь значение 1.

Но

–1L > 1LU,

так как –1L имеет внутреннее представление из одних единиц и, после повышения до типа unsigned long, воспринимается как большое положительное число, в то время, как 1LU имеет единичку в младшем разряде, а остальные разряды  – нули.

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

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

Тип char преобразуется в int путем распространения знака. Например,

int = ’0’; // i = 48

Тип long превращается в int или char путем отбрасывания старших разрядов. Например,

char c = 305; // c=’1’

так как

30510=25610+4910=0000 0001 0011 00012

и после отбрасывания старших разрядов останется

0011 00012=4910=’1’.

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

int i = 3.1415; // i = 3

Если double преобразуется во float, значение либо округляется, либо обрезается, это зависит от реализации.