如何比较两个BOOL变量是否相等?

miky 2009-10-01 05:48:44
大家知道在VC里,BOOL是个int, 那么如何比较两个BOOL变量呢?

BOOL bOne;
BOOL bTwo;

if (bOne == bTwo) 显然不够安全, 那么最好的比较方法是什么呢?

...全文
3574 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphiwcdj 2009-10-03
  • 打赏
  • 举报
回复 1
[Quote=引用 37 楼 jameshooo 的回复:]
BOOL就是BOOL,它本身就是用来做条件判断的,似乎很少需要比较两个BOOL变量的。如果实在要比较,用 !a == !b 就可以了,它能把非0、1的值都转换成0、1,这样比较就是安全的。
[/Quote]
同意
miky 2009-10-03
  • 打赏
  • 举报
回复 1
看来没有比 !a == !b 更好的办法了。
jameshooo 2009-10-03
  • 打赏
  • 举报
回复
BOOL就是BOOL,它本身就是用来做条件判断的,似乎很少需要比较两个BOOL变量的。如果实在要比较,用 !a == !b 就可以了,它能把非0、1的值都转换成0、1,这样比较就是安全的。
lanseshenhua 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 xiaoc1026 的回复:]
吃饱了撑着没事干,傻不垃圾的LZ,以为自己很牛逼其实很挫
[/Quote]

不管楼主的问题怎么样,我觉得最起码不应该骂人,你说呢?
LuciferStar 2009-10-02
  • 打赏
  • 举报
回复
似乎只要排出FALSE就可以了,既然非FALSE,那肯定是TRUE喽?
不需要管这个TRUE是1或者2.
jackyjkchen 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 miky 的回复:]
引用 9 楼 jackyjkchen 的回复:
因此,只要保证大写BOOL用大写TRUE、FALSE赋值,小写bool用小写true、false赋值,别用数字,那么无论BOOL还是bool,取值范围都只有0、1,那就安全得很

你都说了,只要保证才能安全, 但谁能保证?
[/Quote]
代码是你自己写的……
glacier3d 2009-10-02
  • 打赏
  • 举报
回复
BOOL多为一些库函数的返回类型,不用管
自己用的时候,要不用bool,要不用BOOL的时候,规定只能用TRUE/FALSE赋值就o了(一个编码规范而已)
miky 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 tr0j4n 的回复:]
有什么问题?
[/Quote]
问题就是TURE 不唯一。
miky 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jackyjkchen 的回复:]
引用 11 楼 miky 的回复:
引用 9 楼 jackyjkchen 的回复:
因此,只要保证大写BOOL用大写TRUE、FALSE赋值,小写bool用小写true、false赋值,别用数字,那么无论BOOL还是bool,取值范围都只有0、1,那就安全得很

你都说了,只要保证才能安全, 但谁能保证?

代码是你自己写的……
[/Quote]

就算是你自己写的,也不能保证
简单举个例子; 我们在绘制控件的时候经常这样用:
BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
那么你说bSelected是多少, 反正我不知道。
你总不能这样写吧(会给开除的)
if (lpDrawItemStruct->itemState & ODS_SELECTED)
bSelected = TRUE;
else
bSelected = FALSE;


会思考的草 2009-10-02
  • 打赏
  • 举报
回复
理论上说,bool只有true和false两种值。不管bool本身是用何种类型来实现的。
如果两个bool值相等,即同为true或者同为false,那么根据bool代数,只要判断逻辑异或是否为false即可。
MoXiaoRab 2009-10-02
  • 打赏
  • 举报
回复
有什么问题?
miky 2009-10-02
  • 打赏
  • 举报
回复
20分太少了,1人不够1分,加分了。

C/C++ 的Boolean变量很是问题啊。
MoXiaoRab 2009-10-02
  • 打赏
  • 举报
回复
晕。。。。不安全??汗死

不安全就是你编码有问题,大项目纠结在这种细节上面岂不是很挫?
hbprotoss 2009-10-02
  • 打赏
  • 举报
回复
如果用不做真假判断的话用bool干嘛?
MoXiaoRab 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 luciferstar 的回复:]
似乎只要排出FALSE就可以了,既然非FALSE,那肯定是TRUE喽?
不需要管这个TRUE是1或者2.
[/Quote]
我觉得这个说得不错,没必要钻这种牛角尖
miky 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 jackyjkchen 的回复:]
连微软为了避免广受抨击的缓冲区漏洞,都放弃了lstrcpy等一大批传统的高速API,换用了速度较慢的安全版本,从Vista开始,微软的编码规则就禁止使用不安全API和string.h里面不带_s的库函数,Vista变慢和这个有很大原因。

你要是要安全,就别太在意代码是不是罗嗦是不是效率低,安全和效率是一对矛盾,你总得有所取舍
[/Quote]
安全和效率有的时候是矛盾,但并不总是矛盾。 而且在安全的前提下,最求高效率有什么不对吗?
Vista明显是一个失败的操作系统,Windows 7作了很多优化,性能上有了很大提升,兼容性也好了很多才获得了大家的认可。
精益求精是一个程序员的美德,安全简洁而且高效的代码看着就舒服, 追求这个有错吗?
BOOL bSelected = (lpDrawItemStruct->itemState & ODS_SELECTED != 0) ? TRUE:FALSE 和我上面的有什么区别? 唯一的区别就是一个一行,一个三行? 这个正是因为BOOL的不安全而做出的妥协, 如果这是最好的方法,当然应该推广使用,但你不能保证别人这样用,也不能保证以前的代码都这样用了。
yangjinming8888 2009-10-02
  • 打赏
  • 举报
回复
if ((bOne && bTwo) || (!bOne && !bTwo))

  //两个变量相等

yangjinming8888 2009-10-02
  • 打赏
  • 举报
回复

[Quote=引用楼主 miky 的回复:]
大家知道在VC里,BOOL是个int, 那么如何比较两个BOOL变量呢?

BOOL bOne;
BOOL bTwo;

  if (bOne == bTwo) 显然不够安全, 那么最好的比较方法是什么呢?


[/Quote]

可以实现
lanseshenhua 2009-10-02
  • 打赏
  • 举报
回复
感觉有点钻牛角尖了。我觉得项目在实施前一定要进行约定,否则不仅仅存在这样一个问题。
jackyjkchen 2009-10-02
  • 打赏
  • 举报
回复
连微软为了避免广受抨击的缓冲区漏洞,都放弃了lstrcpy等一大批传统的高速API,换用了速度较慢的安全版本,从Vista开始,微软的编码规则就禁止使用不安全API和string.h里面不带_s的库函数,Vista变慢和这个有很大原因。

你要是要安全,就别太在意代码是不是罗嗦是不是效率低,安全和效率是一对矛盾,你总得有所取舍
加载更多回复(18)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧