当前位置:  开发笔记 > 编程语言 > 正文

是!! 在C++中转换为bool的安全方法?

如何解决《是!!在C++中转换为bool的安全方法?》经验,为你挑选了6个好方法。

[这个问题有关,但并不等同于这一个 ]

如果我尝试使用某些类型的值作为布尔表达式,我会收到警告.我有时使用三元运算符(?:)转换为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 *doubleT)?

我不是在问好!!t风格.我在问它是否在语义上不同于t ? true : false.



1> fizzer..:

这个论点!运算符和三元运算符的第一个参数都隐式转换为bool,所以!! 和?:是IMO愚蠢多余的演员装饰.我投票支持

b = (t != 0);

没有隐含的转换.



2> Dima..:

或者,您可以这样做: bool b = (t != 0)


我总是使用这个,因为我认为它最清楚地表达了意图.它实际上是编译器在生成警告的情况下所做的事情,但是明确了它.!! 对我来说似乎很烦人.

3> edgar.hollei..:

小心!

布尔值是关于真实性和虚假性的.

整数大约是整数.

这些是非常不同的概念:

真相与虚假是关于决定事物的.

数字是关于计算东西的.

在桥接这些概念时,应该明确地完成.我最喜欢Dima的版本:

b = (t != 0);

该代码清楚地说:比较两个数字并将真值存储在布尔值中.



4> 小智..:

所有有效的技术都将生成相同的代码.

就个人而言,我只是禁用警告,所以我可以使用最干净的语法.铸造到布尔不是我担心意外做的事情.


是的,感谢微软给我们提供清晰和惯用的C代码的警告.

5> EvilTeach..:


是的,这是安全的.


0被解释为false,everthing else为true,
因此!5出现为false
!0出现为true
所以!! 5出现为true



6> Martin York..:

我不会用:

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.

摘要:使用对您所处的上下文提供最有意义的内容.
尝试并明确您正在做的事情


可读性是旁观者的眼睛.例如,我认为前缀运算符比后缀运算符更具可读性,冗长的简洁性和重复的干燥性.(double)否定是前缀运算符(win),比三元(win)短,并且可以被视为单个运算符,而三元运载三个不同的表达式(加上运算符语法).
推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有