【问题标题】:How is the following code evaluated in C? [closed]如何在 C 中评估以下代码? [关闭]
【发布时间】:2014-01-14 10:04:53
【问题描述】:
#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;

【问题讨论】:

  • 你知道|是什么吗?
  • value[expr] ---> 未定义的行为
  • @StefanoSanfilippo 你是什么意思?超出索引的数组是在 C99 中定义的行为吗?否.. 在 OP 问题 value[expr] 中导致超出索引
  • @GrijeshChauhan 哎呀,我以为你在哪里提到 double value[SIZE] 部分并使用 expr 作为一般占位符。是的,我想在 C 语言中有这样一个“特性”会很有趣;)

标签: c bitwise-operators bitwise-or


【解决方案1】:

这是bitwise OR。

这一行:

expr=1|2|3|4; 

就像:

expr = b0001 | b0010 | b0011 | b0100;

所以:

0001
0010
0011
0100
----
0111

expr = b0111;

expr = 7;

【讨论】:

  • 当它到达printf("%f",value[expr]); 时,value[7] 会给你随机值,因为它超出了该数组的范围!
【解决方案2】:

特别是语句: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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-22
      • 2021-04-11
      • 1970-01-01
      • 2010-09-05
      • 2011-09-17
      • 2019-06-08
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多