在C/C++中使用'!!'是一种好的实践吗?它常见吗?

8

可能是重复问题:
C++代码中的双重否定

据我所知,没有任何C/C++教程、手册或者书籍提到过这个技巧。也许是因为这只是一件微不足道的小事,不值得一提。

我使用它是因为C/C++将bool类型与int、long、指针、double等混合在一起。非常常见的情况就是需要将非bool转换为bool。使用(bool)value这样做是不安全的,因此我使用!!来完成。

例如:

bool bValue = !!otherValue;

6
为什么不能使用(bool)value来做那件事情?这样做是不安全的。 - R. Martinho Fernandes
1
这个问题已经在这里讨论过了:https://dev59.com/_3VC5IYBdhLWcg3wliGe 和 https://dev59.com/5moy5IYBdhLWcg3wWcmh - Juliano
9
不存在名为C/C++的编程语言。 - Mark Byers
@MarkByers:虽然有些概念同样适用于两者,但这并不是其中之一。 - Ed S.
1
@KarlKnechtel:那仍然是C风格的转换。C++转换应该是static_cast<bool>(value) - Inverse
显示剩余3条评论
3个回答

19

没问题,任何C或C++程序员都应该能够认识它,但我更喜欢一些更加明确的东西,比如:

(x != 0)

2
+1 更清晰的代码就是更好的代码。 - Juliano

10

我认为 !! 相对于其他一些选择来说已经足够明确了,例如:

if (foo)
  bar = 1;
else
  bar = 0;

或者 bar = foo ? 1 : 0;

由于 !! 只做一件事情,我发现它非常清晰明了。


5
好的,我同意这是可以接受的,但是'!!foo'比'foo ? 1 : 0'更清晰吗?我不同意这一点。 - Ed S.
@EdS。嘿,事实上,我主要是为了反驳你的帖子 - 我不同意你的观点,并认为我们应该让投票来决定。到目前为止,你领先得很好。 :) - sarnold
1
我在C++中从不使用这个(我将其转换为bool或隐式转换),但我在C中经常使用它。在我看来,!!x是如此明显,以至于我看到的是一个!!运算符,而不仅仅是两个! - Robᵩ
3
有些人认为 --> 是一个独立的运算符... ;-) - R.. GitHub STOP HELPING ICE
@jamesdlin:不管是有多少语言经验的人都可以。 - Ed S.
显示剩余2条评论

5
在这种情况下:
bool bValue = !!otherValue;

你不需要写!!。没有它们也能正常工作:

bool bValue = otherValue;

我认为在大多数情况下隐式转换会更好。


隐式转换(当它可能导致数据截断时)会导致编译器警告,而显式转换(通过运算符)则不会。 - ildjarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接