我一直试图了解以下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>(因为有两个增量)?
答案 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()
将返回1
或2
。这取决于实现是先增加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 2
或2 1
或2 3
。