假设我有两个可能有副作用的函数,并返回布尔值。(具有bool
中的定义<stdbool.h>
,因此定义bool
为_Bool
类型)
bool tweedledee(MyState *pmystate);
bool tweedledum(MyState *pmystate);
使用按位运算符组合它们是否安全?
bool both_tweedles = tweedledee(&mystate) & tweedledum(&mystate);
或者
bool either_tweedle = tweedledee(&mystate) | tweedledum(&mystate);
我通常会使用逻辑运算符&&
或||
; 我正在一个项目中,我的团队成员正在使用按位运算符,因为这些函数可能会产生副作用,并且我们希望两个函数都发生。(逻辑运算符正在短路。)
我唯一的保留意见是,我不确定是否bool
可以安全地假定函数返回是否返回1和0,而不是将其作为替代值返回true
。
举个例子:如果邪恶的人按如下方式实施了该怎么办?
bool tweedledee(MyState *pmystate)
{
return 66;
}
bool tweedledum(MyState *pmystate)
{
return 33;
}
然后66 & 33
是0,然后66 | 33
是99。
从C99标准的6.3.1.2/1节开始:
当将任何标量值转换为_Bool时,如果该值比较等于0,则结果为0;否则,结果为0;否则,结果为0。否则,结果为1。
如果您使用stdbool.h
,则bool
(这是定义为的预处理器宏_Bool
)因此只能为0或1,tweedledee
并且和tweedledum
函数不能返回超出该范围的值,并且对它们使用按位运算应该可以实现您的期望。
然而,如果tweedledee
和tweedledum
使用其他一些bool
类型,是不是_Bool
,那么所有的赌注都关闭。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句