#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;
答案 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]会产生意外结果。