-5
#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;
4

3 回答 3

8

这是一个按位 OR

这一行:

expr=1|2|3|4; 

就好像:

expr = b0001 | b0010 | b0011 | b0100;

所以:

0001
0010
0011
0100
----
0111

expr = b0111;

expr = 7;
于 2014-01-14T10:08:38.680 回答
8

特别是语句:expr=1|2|3|4;

|运算符计算其操作数的按位或

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

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

expr=1|2|3|4;               // evaluates to 7
printf("%f", value[expr]);  // accesses array element at index 7 which is out of bounds
于 2014-01-14T10:08:43.197 回答
1

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

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

因此,1|2|3|4 等价于 0001 OR 0010 OR 0011 OR 0100 = 0111(十进制 = 7)

所以 expr = 7。在这种情况下,访问 value[expr] 会产生意想不到的结果。

于 2014-01-14T10:33:21.400 回答