【发布时间】:2010-09-17 09:25:48
【问题描述】:
[此问题与this one相关但不相同。]
如果我尝试使用某些类型的值作为布尔表达式,我会收到警告。我有时不会取消警告,而是使用三元运算符 (?:) 转换为布尔值。使用两个非运算符 (!!) 似乎做同样的事情。
这就是我的意思:
typedef long T; // similar warning with void * or double
T t = 0;
bool b = t; // performance warning: forcing 'long' value to 'bool'
b = t ? true : false; // ok
b = !!t; // any different?
那么,双重非技术真的做同样的事情吗?它比三元技术更安全还是更安全?这种技术对于非整数类型是否同样安全(例如,void * 或 double 用于 T)?
我不是在问!!t 是否是好风格。我在问它在语义上是否与 t ? true : false 不同。
【问题讨论】:
-
当我看到像 "b = t ? true : false;" 这样的行时我总是很想用“b = t”行替换它。已经有一个隐式转换为 bool,为什么要切分语义?
-
正如 Q 所说,因为 b=t 会发出警告
-
有趣的是有多少人在主观上反对
!!。双重否定是 JavaScript 中 惯用的 cast-to-bool 工具,如果 javascripters 得到它,我希望 C++ 用户也会这样做。 -
双重否定在大多数脚本语言中很常见stackoverflow.com/questions/524658/what-does-mean-in-ruby 因此,严格禁止在高级、可理解的代码中使用(至少由作者本人).. :)
-
@GregD 一种情况是为结构中的位字段标志赋值。您的解决方案会截断(至少在某些编译器中),而此处提供的其余解决方案会将标志设置为相关的真值。假设编译器会(为您)做正确的事情并不是明智之举。并且将位字段类型设置为布尔值并不会改变这一点(至少对于我正在处理的编译器)。未定义的行为。
标签: c++ visual-c++ boolean