-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;

演算子は、そのオペランドのビットごとの 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
于 2014-01-14T10:08:43.197 に答える