为什么要输出
Why this output?
我一直在努力理解以下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()
将返回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
不同,因为在count
递增之后,但在读取之前,没有任何东西可以阻止incr()
的调用
- 首先对
++count
进行增量,然后调用incr()
,然后从count
中读取。这将把2
写入arr[2]
- 首先对
++count
进行增量,然后从count
中读取,然后调用incr()
。这将把2
写入arr[1]
- 首先调用
incr()
,然后对++count
进行增量并从中读取。这将把1
写入arr[2]
在这种情况下,可以输出2 2
、2 1
或2 3
。
相关文章:
- 为什么我的代码在输出中增加了93天
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么rk4.do_step不输出C++中的初始条件
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我在输出端得到 nan?
- 为什么递归函数的最终输出是 5?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 为什么输出精度没有正确舍入?
- 为什么这个程序的输出不如预期
- 有人可以向我解释为什么控制台输出 0 吗?
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 执行此代码时,它不显示任何输出.为什么?
- 使用相同消息重新引发新异常会导致垃圾输出.为什么?
- 我的程序产生错误的输出.为什么
- 怪异的输出:为什么这段代码会给出任何有意义的输出,更不用说这个了
- %n格式说明符程序,在不同的编译器上提供不同的输出.为什么?
- 我的简单类函数中出现意外输出.为什么
- 如果语句不求值为false?程序给出奇怪的输出.为什么