Вопрос: Корректно ли использовать сокращенный условный оператор if(p) для проверки того, что указатель ненулевой? А что если внутреннее представление для нулевых указателей отлично от нуля? Ответ: Когда С требует логическое значение выражения (в инструкциях if, while, for, do и для операторов &&, ||, !, и ?: ) значение false получается, когда выражение равно нулю, а значение true получается в противоположном случае. Таким образом, если написано
где "expr" — произвольное выражение, компилятор на самом деле поступает так, как будто было написано
Подставляя тривиальное выражение, содержащее указатель "p" вместо "expr", получим
и это случай, когда происходит сравнение, так что компилятор поймет, что неявный ноль — это нулевой указатель и будет использовать правильное значение. Здесь нет никакого подвоха, компиляторы работают именно так и генерируют в обоих случаях идентичный код. Внутреннее представление указателя не имеет значения. Оператор логического отрицания ! может быть описан так:
Читателю предлагается в качестве упражнения показать, что
Хотя "сокращения" типа if(p) совершенно корректны, кое-кто считает их использование дурным стилем. См. также вопрос 8.2. Смотри: K&R II Разд. A7.4.7 c. 204; H&S Разд. 5.3 c. 91; ANSI Разд. 3.3.3.3, 3.3.9, 3.3.13, 3.3.14, 3.3.15, 3.6.4.1, и 3.6.5. |