Почему/Когда использовать (!! p) вместо (p! = ПУСТОЙ УКАЗАТЕЛЬ)

Вот новое видео на Канале 9, где Anders Hejlsberg от 36:30 в интервью начинает говорить о неизменности в C#. Он дает очень хороший вариант использования для неизменности фруктового мороженого и объясняет, как это - что-то, что Вы в настоящее время обязаны реализовывать сами. Это была музыка к моим ушам, слыша, что он говорит, что это стоит думать о лучшей поддержке создания неизменных графов объектов в будущих версиях Эксперта по C#

Эксперту: Anders Hejlsberg - будущее C#

7
задан sharptooth 22 October 2009 в 08:15
поделиться

7 ответов

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

Сравнение IMO с нулевым указателем более понятно.

9
ответ дан 6 December 2019 в 06:37
поделиться

I thing GMan’s original comment should be the accepted answer:

I wonder what's wrong with just if (p)

The point is: nothing is wrong with it, and this should be the preferred way. First off, !!p is “too clever”; it’s also completely unnecessary and thus bad (notice: we’re talking about pointers in an if statement here, so Anacrolix’ comment, while generally valid, doesn’t apply here!).

The same goes for p != NULL. While this is possible, it’s just not needed. It’s more code, it’s completely redundant code and hence it makes the code worse. The truest thing Jeff Atwood ever said was that “the best code is no code at all.” Avoid redundant syntax. Stick to the minimum (that still conveys the complete meaning; if (p) is complete).

Finally, if (p) is arguably the most idiomatic way to write this in C++. C++ bends over backwards to get this same behaviour for other types in the language (e.g. data streams), at the cost of some very weird quirks. The next version of the standard even introduces new a syntax to achieve this behaviour in user-defined types.

For pointers, we get the same for free. So use it.

/EDIT: About clarity: sharptooth writes that

IMO comparing against null pointer is clearer.

I claim that this is objectively wrong: if (p) is clearer. There is no possible way that this statement could mean anything else, neither in this context nor in any other, in C++.

7
ответ дан 6 December 2019 в 06:37
поделиться

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

11
ответ дан 6 December 2019 в 06:37
поделиться

Насколько я понимаю, это просто более короткий способ преобразовать его в логическое значение. Он применяет! хотя дважды, тогда как p! = NULL выполняет одно сравнение. Так что, я полагаю, преимущество заключается в более коротком коде, хотя и более загадочном, если вы не знаете, что должно означать !! p .

3
ответ дан 6 December 2019 в 06:37
поделиться

В данном примере нет никакой разницы.

Однако предположение, что это применимо ко всем случаям, неверно. a = not not b не то же самое, что a = b , что касается целочисленных типов.

В C, 0 является ложным. Все, кроме 0 верно. Но не 0 это 1 и ничего больше. В C ++ значение true преобразуется в 1 как целое число не только для обратной совместимости с C, но и потому, что 1 не равно 0 , а 1 является наиболее распространенным значением, используемым для обозначения истины в типах C bool, включая официальный тип C bool и BOOL , используемый в Win32.

Хотя для примера кода приведен , !! p не требуется, потому что результат приводится к bool для оценки условия if , что не исключает использования !! для приведения логических значений к ожидаемым целочисленным значениям. Лично в этом примере, чтобы максимизировать вероятность того, что изменения типа и семантика ясны, я бы использовал NULL! = P или p! = NULL , чтобы было абсолютно ясно, что имеется в виду.

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

-1
ответ дан 6 December 2019 в 06:37
поделиться

Они такие же, но я рекомендую использовать

NULL != p

Он более читабельный.

0
ответ дан 6 December 2019 в 06:37
поделиться

НЕ используйте двойное отрицание. Простой аргумент состоит в том, что, поскольку C ++ - это ограниченное подмножество английского языка, а английский просто не имеет двойного отрицания, англоговорящим будет очень сложно разобрать, что происходит.

-2
ответ дан 6 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: