Вопрос о стиле! Условие против условия == NULL - PullRequest
6 голосов
/ 28 ноября 2010

Если вы вызываете какую-то функцию, и эта функция возвращает NULL в случае ошибки (например, malloc() или fopen()), какой из двух вариантов лучше:

FILE *fp = fopen(argv[0], "r");

if (fp == NULL) {
    // handle error
}

или

if (!fp) {
    // handle error
}

Это просто вопрос стиля?Я думаю, что первый из них более понятен, поскольку он более явный, но тогда я редко пишу код на C: -).

Ответы [ 6 ]

7 голосов
/ 29 ноября 2010

Я предпочитаю сравнивать с NULL, потому что ясно, что оба операнда сравнения должны быть указателями.Это

(! P)

или

(p == 0)

требует, чтобы вы знали, какой тип p (целое число? Aлогический?) с первого взгляда.Я придерживаюсь мнения, что все кодирование должно выполняться с предположением, что вам придется отлаживать эту штуку в 4 часа утра (это 4 часа утра, для тех, кто не спит) 9 месяцев спустя.В этом случае каждый маленький кусочек помогает.

О, и это хорошая практика, чтобы при проверке на равенство ставить константы в качестве первого операнда, чтобы компилятор прерывался с ошибкой, если вы случайно превратили его в присваивание.

7 голосов
/ 28 ноября 2010

Я считаю, что это вопрос стиля. Лично мне второй вариант больше нравится. Другим нравится первый, потому что он более четкий и более «правильный». Некоторые люди даже пишут if (NULL == fp), поэтому они никогда не могут случайно забыть один = и превратить его в задание. В общем, я думаю, что это вопрос вкуса, и, наверное, важнее быть последовательным.

3 голосов
/ 28 ноября 2010

Я предпочитаю первое в этом случае, так как вы явно сравниваете значение, чтобы увидеть, является ли оно нулевым (что бывает 0).

Второй читается так, как будто fp - логическое значение, а это не так.

Это все равно, что сказать "Является ли этот указатель недействительным?" vs "Является ли этот указатель ложным?"

Какой из них более читабелен для вас , это, конечно, вопрос мнения.

2 голосов
/ 29 ноября 2010

Я предпочитаю "=="; Я думаю, что читатель должен думать меньше. Вот почему я ненавижу typedefs.

1 голос
/ 29 ноября 2010

Это просто вопрос стиля?

В случае C, это просто вопрос стиля, так как оба верны, но в целом, я считаю, что все больше людей (включая меня) предпочитают явное сравнение (ptr == NULL), о чем свидетельствует следующее: *

  • C ++ 0x вводит ключевое слово nullptr, чтобы подчеркнуть, что это больше, чем просто число или логическое значение.
  • Java вызывает явные сравнения (obj == null) и не разрешает !obj.
0 голосов
/ 29 ноября 2010

Да, это вопрос стиля.fp == NULL (упс, я написал fp = NULL ...) очень ясно и ясно выражено, и это хорошо для тех, кто не знаком со всеми поворотами Си.Хотя !fp очень похоже на идиому и каламбур: «на фп есть , а не (!)».Муравей это коротко.Для этого мне нравится !fp.Я думаю, что разработчикам C тоже нравится это, иначе они не должны определять ! для указателей.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...