#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;
#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;
这是一个按位 OR。
这一行:
expr=1|2|3|4;
就好像:
expr = b0001 | b0010 | b0011 | b0100;
所以:
0001
0010
0011
0100
----
0111
expr = b0111;
expr = 7;
特别是语句: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
在 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] 会产生意想不到的结果。