[这个问题有关,但并不等同于这一个 ]
如果我尝试使用某些类型的值作为布尔表达式,我会收到警告.我有时使用三元运算符(?:
)转换为bool 而不是抑制警告.使用两个not运算符(!!
)似乎做同样的事情.
这就是我的意思:
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
.
这个论点!运算符和三元运算符的第一个参数都隐式转换为bool,所以!! 和?:是IMO愚蠢多余的演员装饰.我投票支持
b = (t != 0);
没有隐含的转换.
或者,您可以这样做: bool b = (t != 0)
小心!
布尔值是关于真实性和虚假性的.
整数大约是整数.
这些是非常不同的概念:
真相与虚假是关于决定事物的.
数字是关于计算东西的.
在桥接这些概念时,应该明确地完成.我最喜欢Dima的版本:
b = (t != 0);
该代码清楚地说:比较两个数字并将真值存储在布尔值中.
所有有效的技术都将生成相同的代码.
就个人而言,我只是禁用警告,所以我可以使用最干净的语法.铸造到布尔不是我担心意外做的事情.
是的,这是安全的.
0被解释为false,everthing else为true,
因此!5出现为false
!0出现为true
所以!! 5出现为true
我不会用:
bool b = !!t;
这是最不易读的方式(因此最难维护)
其他人取决于具体情况.
如果您要转换为仅在bool表达式中使用.
bool b = t ? true : false; if (b) { doSomething(); }
然后我会让语言为你做:
if (t) { doSomething(); }
如果您实际存储了一个布尔值.然后我首先想知道为什么你在第一个需要演员的地方有很长的路要走.假设您需要long和bool值,我会考虑以下所有情况,具体取决于具体情况.
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(t); // Implies that t has no semantic meaning // except as a bool in this context.
摘要:使用对您所处的上下文提供最有意义的内容.
尝试并明确您正在做的事情