使用按位或

时间:2018-02-02 07:25:05

标签: c valgrind bitwise-or

偶然的,我写了

if (var < 0 | List == NULL) {
   ...
}

其中varint并列出int*(整数数组)。

我打算写

if (var < 0 || List == NULL) {
   ...
} 

我知道

  

运算符|,&amp;和〜并行地对各个位进行操作。他们能   仅用于整数类型。 a | b进行独立的OR操作   a的每个比特与b的相应比特一起产生该比特   结果。

来自here

我不明白的是valgrind(选项--leak-check=full)在第一种情况下给了我错误Invalid read of size 8而在第二种情况下没有错误。

我认为varList的数据访问在两种情况下都是相同的。

List == NULL的结果是什么类型?

1 个答案:

答案 0 :(得分:3)

  

&#34;我认为varList的数据访问权限相同   例&#34;

不,差异是short-circuit evaluation。使用逻辑OR时,List == NULL时不会计算表达式var < 0

但是使用按位OR,即使List == NULL 也会评估var < 0。为什么会触发&#34;无效读取大小为8&#34;很难说,因为你没有显示足够的代码。但我怀疑List时未初始化var < 0