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

use*_*439 -4 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; 
}
Run Code Online (Sandbox Code Playgroud)

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

expr=1|2|3|4;
Run Code Online (Sandbox Code Playgroud)

jml*_*jml 8

这是一个按位OR.

这一行:

expr=1|2|3|4; 
Run Code Online (Sandbox Code Playgroud)

就好像:

expr = b0001 | b0010 | b0011 | b0100;
Run Code Online (Sandbox Code Playgroud)

所以:

0001
0010
0011
0100
----
0111

expr = b0111;

expr = 7;
Run Code Online (Sandbox Code Playgroud)


And*_*ter 8

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

|运营商计算按位或操作数的:

    1 = 00000001b
    2 = 00000010b
    3 = 00000011b
    4 = 00000100b
    -------------
Result: 00000111b = 7
Run Code Online (Sandbox Code Playgroud)

因此,您将最终观察到未定义的行为,因为您正在访问不存在的数组元素:

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