#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;
演算子は、そのオペランドのビットごとの or を計算し|
ます。
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