将按位运算作为参数传递给C中的函数

时间:2017-07-05 10:53:27

标签: c

如果我们使用以下参数调用函数

,那么参数值是什么
void func((0x1 | 0x3))

如果此操作的结果为> 0,它是真的吗?相反,它给出了假,或者我们得到0x3作为此操作的返回值?

4 个答案:

答案 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,则不转换该值。