Вопрос: Корректно ли использовать сокращенный условный оператор if(p) для проверки того, что указатель ненулевой? А что если внутреннее представление для нулевых указателей отлично от нуля?

Ответ:
Когда С требует логическое значение выражения (в инструкциях if, while, for, do и для операторов &&, ||, !, и ?: ) значение false получается, когда выражение равно нулю, а значение true получается в противоположном случае. Таким образом, если написано
  if(expr)

где "expr" — произвольное выражение, компилятор на самом деле поступает так, как будто было написано
  if(expr != 0)

Подставляя тривиальное выражение, содержащее указатель "p" вместо "expr", получим
  if(p)    эквивалентно    if(p != 0)

и это случай, когда происходит сравнение, так что компилятор поймет, что неявный ноль — это нулевой указатель и будет использовать правильное значение. Здесь нет никакого подвоха, компиляторы работают именно так и генерируют в обоих случаях идентичный код. Внутреннее представление указателя не имеет значения.

Оператор логического отрицания ! может быть описан так:
  !expr    на самом деле эквивалентно    expr?0:1

Читателю предлагается в качестве упражнения показать, что
  if(!p)    эквивалентно    if(p == 0)

Хотя "сокращения" типа 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.
Автор: Кодт    Оценить