如果我们使用以下参数调用函数
,那么参数值是什么void func((0x1 | 0x3))
如果此操作的结果为> 0,它是真的吗?相反,它给出了假,或者我们得到0x3作为此操作的返回值?
答案 0 :(得分:3)
由于您只使用了一个管道,因此结果是按位OR,而不是逻辑OR:
0x01 | 0x03 ---> 0x03
Logical OR使用两个管道:
0x01 || 0x03 ---> 1
答案 1 :(得分:2)
0x1 | 0x3
是一个编译时可评估的常量表达式:它是int
类型,值为3.
如果您考虑的是||
运算符,那么在C中,0x1 || 0x3
的值为int
类型,值为1,因为||
的评估停在第一个非零参数。这种短路属性也适用于C ++,但这里的类型为bool
,其值为true
,如果func
过载,则必须格外小心 1 :
void func(int)
{
// pay me a bonus
}
#ifdef __cplusplus
void func(const bool&)
{
// reformat my hard disk
}
#endif
<小时/> 1 C ++允许函数重载,C不会。另一个重要的区别。
答案 2 :(得分:0)
|
是按位运算,因此结果为3
答案 3 :(得分:0)
从布尔角度来看,值0为false,任何非零值都被评估为true。
因为你正在使用按位OR运算符|
,所以表达式(0x1 | 0x3)
的值为0x3:
00000001 = 0x1
| 00000011 = 0x3
----------
00000011 = 0x3
如果将此值传递给期望_Bool
(或等效bool
)的函数,则根据C standard的第6.3.1.2节进行转换:
当任何标量值转换为
_Bool
时,如果是,则结果为0 值比较等于0;否则,结果是1。
如果函数期望int
,则不转换该值。