为什么要输出

Why this output?

本文关键字:输出 为什么      更新时间:2023-10-16

我一直在努力理解以下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;
}

程序给出12作为输出,我不想解释的是,为什么这里的计数值是1,而不是2(因为有两个增量(?

=运算符的操作数的求值顺序在arr[count++]=incr();中未指定,由于两个操作数都试图修改同一全局变量count,因此根据求值顺序,不同编译器的结果会有所不同。

编辑

事实上,行为是未定义的(这意味着任何事情都可能发生(,因为"变量count的先前值(仅(不会被访问以确定要存储的值。">

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

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

我们这里有多种场景:

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

因此,count总是2arr[count]总是3(它没有被覆盖(。所以它应该输出2 3,而不是1 2

我认为,如果你做以下,你有更多的选择

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

现在,从++count读取的值可能与count+1不同,因为在count递增之后,但在读取之前,没有任何东西可以阻止incr()的调用

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

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