是! 一个安全的方式来转换为C ++布尔?
[这个问题与这个问题有关,但不一样。]
如果我尝试使用某些types的值作为布尔expression式,我会收到警告。 我有时候使用三元运算符( ?:
:)来转换为布尔值,而不是压制这个警告。 使用两个不操作符( !!
)似乎也是一样的。
这是我的意思:
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?
那么,双重技术不是真的做同样的事情吗? 它是否比三元技术更安全? 这种技术对于非整数types是否同样安全(例如, void *
或T
double
)?
我不是问是否好风格。 我在问,它是否在语义上与t ? true : false
不同t ? true : false
t ? true : false
。
的论据! 运算符和三元运算符的第一个参数都隐式转换为bool,所以!! 和?:是国际海事组织愚蠢的重复装饰的演员。 我投票
b = (t != 0);
没有隐式转换。
或者,你可以这样做: bool b = (t != 0)
小心!
- 布尔是关于真相和虚假。
- 整数是关于整数。
这些是非常独特的概念:
- 真相和虚假是关于决定的东西。
- 数字是关于计数的东西。
在弥合这些概念时,应该明确地做。 我最喜欢迪玛的版本:
b = (t != 0);
该代码清楚地表明:比较两个数字并将真值存储在布尔值中。
所有有效的技术,都将生成相同的代码。
就个人而言,我只是禁用警告,所以我可以使用最干净的语法。 铸造到一个布尔是不是我担心意外做的事情。
是的,这是安全的。
0被解释为错误,否则是真实的,
因此!5出来是一个错误
!0出来是真的
所以!! 5出来是真的
我不会使用:
bool b = !!t;
这是最不可读的方式(因此最难维护)
其他人则视情况而定。
如果您正在转换为仅在boolexpression式中使用。
bool b = t ? true : false; if (b) { doSomething(); }
那么我会让语言为你做:
if (t) { doSomething(); }
如果你实际存储一个布尔值。 那么首先我会想知道为什么你在需要演员的地方有很长的一段时间。 假设你需要长期和布尔价值,我会考虑以下所有情况。
bool b = t ? true : false; // Short and too the point. // But not everybody groks this especially beginners. bool b = (t != 0); // Gives the exact meaning of what you want to do. bool b = static_cast<bool>(t); // Implies that t has no semantic meaning // except as a bool in this context.
简介:使用为您所处的上下文提供最多含义的内容。
试着明确你在做什么
我build议不要压制这个警告,也不要使用交stream投(bool)来压制它。 转换可能并不总是如您所想的那样被调用。
评估为true的expression式和该值的布尔值之间有区别。
两个! 和三元组习惯,但同样的工作,如果你不想定义内部types重载转换布尔。
Dima的方法也很好,因为它将expression式的值赋给bool。
如果你担心这个警告,你也可以强制转换: bool b = (bool)t;
我真的很讨厌!! t !!!!!! 它让人想起了关于C和C ++的最糟糕的事情,那就是你的语法太巧妙了。
bool b(t!= 0); / /恕我直言,是最好的方式,它明确显示发生了什么。
! 可能是紧凑的,但我认为这是不必要的复杂。 在我看来,最好禁用警告或使用三元操作符。
我会用b =(0!= t) – 至less任何理智的人都可以很容易的读懂它。 如果我在代码中看到double dang,我会感到非常惊讶。
禁用警告。
首先写清楚; 然后简介; 然后根据需要优化速度。
! 仅在以算术方式使用布尔expression式时才有用,例如:
c = 3 + !!extra; //3 or 4
(谁的风格是一个不同的讨论。)当你需要的是一个布尔expression式,! 是多余的。 写作
bool b = !!extra;
如下所示:
if (!!extra) { ... }
这个double对我来说不好感,在debugging代码中会比在优化代码中有很大的不同。
如果你爱上了! 你总是可以macros观它。
#define LONGTOBOOL(x) (!!(x))
(在这种情况下,三元运算符就是我所喜欢的)
我build议使用
如果(x!= 0)
要么
如果(x!= NULL)
而不是if(x); 这更容易理解和阅读。
我会使用bool b = t并留下编译警告,评论这个特定行的安全性。 禁用警告可能会让你陷入另一部分代码中。