Язык С в вопросах и ответах



             

Язык С в вопросах и ответах - сстр. 7


вопрос 1.8).

        Смотри: ANSI Rationale Разд. 4.1.5 c. 74.

1.6:  Я использую макрос

            #define     Nullptr(type) (type *)0 ,

        который помогает задавать тип нулевого указателя.

О:    Хотя этот трюк и популярен в определенных кругах, он стоит немного.
      Он не нужен при   сравнении и присваивании; см. вопрос 1.2. Он даже
      не экономит буквы. Его использование показывает      тому, кто читает
      программу, что автор здорово "сечет" в нулевых указателях, и требует
        гораздо более аккуратной проверки определения макроса, его
        использования и _всех_ остальных случаев применения указателей.
        См. также вопрос 8.1.

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

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

            if(expr)

        где "expr" - произвольное выражение, компилятор на самом деле
        поступает так, как будто было написано

            if(expr != 0)

      Подставляя тривиальное выражение, содержащее указатель "p" вместо
      "expr",     получим

              if(p)            эквивалентно            if(p != 0)

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

        Оператор логического отрицания ! может быть описан так:



Содержание  Назад  Вперед