如何在C中评估以下代码?

时间:2014-01-14 10:04:53

标签: c bitwise-operators bitwise-or

#include<stdio.h> 

int main()
{ 
  int const SIZE=5; 
  int expr; 
  double value[SIZE]={2.0,4.0,6.0,8.0,10.0}; 
  expr=1|2|3|4; 

  printf("%f",value[expr]); 
  return 0; 
}

如何评估上述代码?特别声明:

expr=1|2|3|4;

3 个答案:

答案 0 :(得分:8)

这是bitwise OR

这一行:

expr=1|2|3|4; 

就像:

expr = b0001 | b0010 | b0011 | b0100;

所以:

0001
0010
0011
0100
----
0111

expr = b0111;

expr = 7;

答案 1 :(得分:8)

  

特别声明:expr = 1 | 2 | 3 | 4;

|运算符计算其操作数的bitwise or

    1 = 00000001b
    2 = 00000010b
    3 = 00000011b
    4 = 00000100b
    -------------
Result: 00000111b = 7

所以,你最后会看到undefined behaviour,因为你正在访问一个不存在的数组元素:

expr=1|2|3|4;               // evaluates to 7
printf("%f", value[expr]);  // accesses array element at index 7 which is out of bounds

答案 2 :(得分:1)

在C(和许多其他编程语言)中,|是一个按位运算符OR。

将十进制转换为二进制     1 = 0001     2 = 0010     3 = 0011     4 = 0100

因此,     1 | 2 | 3 | 4当量         0001      或者0010      或者0011      或0100     = 0111(十进制= 7)

所以expr = 7。 在这种情况下,访问值[expr]会产生意外结果。