c ›= '0' && c ‹= '9'
можно заменить на isdigit(c)
Далее мы будем пользоваться функциями из ‹ctype.h›.
Существует одна тонкость, касающаяся преобразования символов в целые числа: язык не определяет, являются ли переменные типа charзнаковыми или беззнаковыми. При преобразовании charв intможет ли когда- нибудь получиться отрицательное целое? На машинах с разной архитектурой ответы могут отличаться. На некоторых машинах значение типа charс единичным старшим битом будет превращено в отрицательное целое (посредством "распространения знака"). На других - преобразование charв intосуществляется добавлением нулей слева, и, таким образом, получаемое значение всегда положительно.
Гарантируется, что любой символ из стандартного набора печатаемых символов никогда не будет отрицательным числом, поэтому в выражениях такие символы всегда являются положительными операндами. Но произвольный восьмибитовый код в переменной типа charна одних машинах может быть отрицательным числом, а на других - положительным. Для совместимости переменные типа char, в которых хранятся несимвольные данные, следует специфицировать явно как signedили unsigned.
Отношения вроде i › j и логические выражения, перемежаемые операторами amp;&и ||, определяют выражение-условие, которое имеет значение 1, если оно истинно, и 0, если ложно. Так, присваивание
d = c ›= '0' && c ‹= '9'
установит d в значение 1, если c есть цифра, и 0 в противном случае. Однако функции, подобные isdigit, в качестве истины могут выдавать любое ненулевое значение. В местах проверок внутри if, while, for и пр. "истина" просто означает "не нуль".
Неявные арифметические преобразования, как правило, осуществляются естественным образом. В общем случае, когда оператор вроде + или * с двумя операндами (бинарный оператор) имеет разнотипные операнды, прежде чем операция начнет выполняться, "низший" тип повышается до "высшего". Результат будет иметь высший тип. В параграфе 6 приложения A правила преобразования сформулированы точно. Если же в выражении нет беззнаковых операндов, можно удовлетвориться следующим набором неформальных правил:
· Если какой-либо из операндов принадлежит типу long double, то и другой приводится к long double.
· В противном случае, если какой-либо из операндов принадлежит типу double, то и другой приводится к double.
· В противном случае, если какой-либо из операндов принадлежит типу float, то и другой приводится к float.
· В противном случае операнды типов charи shortприводятся к int.
· И наконец, если один из операндов типа long, то и другой приводится к long.
Заметим, что операнды типа floatне приводятся автоматически к типу double; в этом данная версия языка отличается от первоначальной. Вообще говоря, математические функции, аналогичные собранным в библиотеке ‹math.h›, базируются на вычислениях с двойной точностью. В основном floatиспользуется для экономии памяти на больших массивах и не так часто - для ускорения счета на тех машинах, где арифметика с двойной точностью слишком дорога с точки зрения расхода времени и памяти.
Правила преобразования усложняются с появлением операндов типа unsigned. Проблема в том, что сравнения знаковых и беззнаковых значений зависят от размеров целочисленных типов, которые на разных машинах могут отличаться. Предположим, что значение типа intзанимает 16 битов, а значение типа long- 32 бита. Тогда -1L ‹ 1U, поскольку 1U принадлежит типу unsigned intи повышается до типа signed long. Но -1L ›1UL, так как -1L повышается до типа unsigned longи воспринимается как большое положительное число.
Преобразования имеют место и при присвоениях: значение правой части присвоения приводится к типу левой части, который и является типом результата.
Тип charпревращается в intпутем распространения знака или другим описанным выше способом.
Тип long intпреобразуются в short intили в значения типа charпутем отбрасывания старших разрядов. Так, в
int i;
char c;
i = c;
c = i;
значение c не изменится. Это справедливо независимо от того, распространяется знак при переводе charв intили нет. Однако, если изменить очередность присваиваний, возможна потеря информации.
Читать дальше