Информатика и технология программирования


" Подводные камни" и " маленькие хитрости"


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


if (a=b) // вместо if (a==b)


while (a &#60&#60 3) // вместо while (a &#60 3)


if (a &#38&#38 0x10) // вместо if (a &#38 0x10)

Трудно обнаруживаемые ошибки возникают при неявных преобразованиях типов в операциях, особенно при сочетании знаковой и беззнаковой форм представления:


char c[80];
&#35define CODE 193
if (c[i] == CODE) // Эквивалентно (int)c[i] == 193


В данном примере идентификатором CODE обозначена целая константа, которая имеет смысл кода символа, на наличие которого затем проверяются элементы массива символов. Но дело в том, что такая операция будет давать значение "ложь" всегда. Дело в том, что тип char представляет символы как знаковые байты (целые минимальной длины), поэтому этому коду в данной форме представления соответствует отрицательное значение - 63 . Так как любая операция преобразует операнды char к int , то получится интересное сочетание "-63 == 193", имеющее значение "ложь" вместо планируемого "истина". В таких случаях, когда разрядности переменных меняются, лучше не смешивать знаковую и беззнаковую формы. В данном случае исправить ошибку можно несколькими способами


&#35define CODE -63 // Непонятно


&#35define CODE (char)193 // Приемлемо


&#35define CODE '\301' //


unsigned char c[80]; // Лучше всего для символов с кодами &#62 128

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


Начало  Назад  Вперед