是! 一个安全的方式来转换为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并留下编译警告,评论这个特定行的安全性。 禁用警告可能会让你陷入另一部分代码中。