在C ++之前的11天里,写作更好的做法被认为是:
if (ptr == NULL)
而不是:
if (!ptr)
这有两个原因。它更有效率,因为它不需要强制转换为bool。并且无法保证宏NULL
确实会评估为布尔值false
。这在C ++ 11中仍然如此吗?是否最好写
if (ptr == nullptr)
而不是
if (!ptr)
或者现在是第二次罚款?
答案 0 :(得分:5)
效率更高,因为它不需要强制转换为bool。
我打了一个'[citation-needed]
。我怀疑任何现代编译器都会考虑到这一点。
if (ptr)
完全没问题且可能在语义上更正确。
我只希望看到if (ptr != nullptr)
如果某人实际上正在使用“null”值进行指针算术,但即使这样,它也非常粗略。
话虽如此,很多时候你可以侥幸逃脱...根本没有检查。如果指针的可为空性用于表示可空数据字段,请使用optional
。如果您正在初始化它以防它为空,请使用value_or
惯用法。如果它只是一个弱参考而且价值合约在外面,那么assert
就可以了。
答案 1 :(得分:4)
unique_ptr
和shared_ptr
等智能指针对bool
进行隐式转换,检查内部指针与nullptr
,因此在这些情况下第二个是首选,因为意图很清楚。
对于原始指针,我不知道是否有任何实际指导,但ptr != nullptr
肯定更清楚地解释了意图(以及涉及的类型)。
答案 2 :(得分:1)
这是一个可读性问题,因为编译器是先进的,以便在两种情况下都能得到最佳处理。一个例外是,如果您创建自己的指针类,其中!ptr
必须由您的代码进行评估,并且突然两个语法不一定是等价的。所以我建议在编写通用代码时使用if (ptr != nullptr)
语法。
答案 3 :(得分:1)
RE
“在C ++之前的11天里,写作被认为是更好的做法:
if (ptr == NULL)
而不是:
if (!ptr)
不,不是知情人士。
“这有两个原因。它更有效率,因为它不需要强制转换为bool。
不,这两个表达式是等价的,一个不是比另一个更有效。而“演员”是符号。将它与执行效率混淆是毫无意义的。
“并且无法保证宏NULL确实会评估为布尔值false。
确实有这样的保证。
“在C ++ 11中是否仍然如此?
在C ++ 11和C ++ 14中,它仍然是假的,在C ++ 17中仍然是假的。
答案 4 :(得分:1)
在C中,因为这里有很多人说你是否隐含地转换为bool
或明确地与NULL
进行比较,这确实只是风格问题。
在C ++ 11中,故事却不同。 nullptr
提供类型安全性。请考虑以下示例:
auto ptr = accessVal();
if (ptr == nullptr) {cout << "Pointer is null."};
VS
auto ptr = accessVal();
if (!ptr) {cout << "Pointer is null."};
如果ptr
是一个指针,第一个只会编译。如果ptr
可以隐式地转换为bool
,则第二个将编译。
总结隐式转换为bool
的优点是简洁。与nullptr
进行比较的优点是类型安全。我认为在大多数情况下,如果类型安全超过简洁的好处,那么这样做会带来好处。实际上,这是首先在C ++ 11中引入nullptr
的主要原因。