为何输​​出?

时间:2011-04-29 04:03:30

标签: c++ c arrays

我一直试图了解以下C程序:

#include <stdio.h>

int arr[] = {1,2,3,4};
int count;

int incr(){
 return ++count;
}

int main(){  
   arr[count++]=incr();
   printf("%d %d",count,arr[count]);    
   return 0;
}

该程序提供 1 2 output,我没有打印的是为什么count的值 1 ,而不是 2 < / em>(因为有两个增量)?

2 个答案:

答案 0 :(得分:5)

=中未指定arr[count++]=incr();运算符的操作数的评估顺序,并且因为两个操作数都试图修改相同的全局变量count,所以不同编译器的结果会有所不同取决于评估顺序。

修改

实际上行为未定义(这意味着任何事情都可能发生),因为"the prior value of the variable count is not accessed (only) to determine the value to be stored."

答案 1 :(得分:4)

incr()将返回12。这取决于实现是先增加count然后调用incr(),还是首先调用incr()然后增加count

请注意,此选择并不意味着行为未定义。因为在输入函数之前,在函数离开之后,每个点都有一个序列点,我们这里的两个增量都被一个序列点分开,所以main的增量,如果它开始于在通话之前发生,一旦输入incr()就会结束,如果在incr()被调用后发生,则在incr()离开之前尚未开始。

我们在这里有多个场景:

  • 首先执行count++的增量,然后调用incr()。这会将2写入arr[0]
  • 首先调用incr(),然后执行count++的增量。这会将1写入arr[1]

因此,count始终为2,而arr[count]始终为3(未被覆盖)。因此,它应输出2 3,而不是1 2

我认为如果您执行以下操作,则有更多选项

int main(){  
   arr[++count]=incr();
   printf("%d %d",count,arr[count]);    
   return 0;
}

现在,从++count读取的值可能与count+1不同,因为在递增incr()之后但在读取之前没有任何内容可以阻止count被调用。在这种情况下,我们有

  • 首先执行++count的增量,然后调用incr(),然后从count读取。这会将2写入arr[2]
  • 首先执行++count的增量,然后从count读取,然后调用incr()。这会将2写入arr[1]
  • 首先调用incr(),然后执行++count的增量并从中读取。这会将1写入arr[2]

在这种情况下,您可以输出2 22 12 3