声明
该问题本身没有多大意义,但是看到网上有人问这个问题,我和另一个小伙伴也没在网上找到有很本质的解释,所以浅浅探索了一下。
该问题在不同的编译器上,最终 i
的值是不同的。所以如果你在试卷上看到这个狗血题目,你大可以站起来反驳出题老师,说:“鄙人认为该题答案不唯一,建议老师少出这种题目”。
由于笔者能力有限,难免有知识点疏忽错误的情况,如果您发现有错误,请在下方评论区给出您宝贵的建议。
正文
下面我将使用两种编译器来对同一段代码进行编译,我们调试查看该段代码的汇编指令,相信我,看完你一定恍然大悟。
//main.c
#include <stdio.h>
int main(int argc, char **argv){
int i = 0;
i = i++;
printf("%d", i);
return 0;
}
如果你没见过这段代码,可以猜一下i
的值是多少,但不建议自己在写代码的时候有这种代码的出现(如果被别人看到,有英年早逝的风险)。
环境一
- gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
- objdump (GNU objdump (GNU Binutils) 2.30)
执行指令:gcc -g -c main.c # 在当前目录下会生成一个 main.o 文件
objdump -d -M intel -S main.o
指令的意思就是生成Intel风格的汇编代码,详细信息请自行检索。
打开生成的汇编代码:
根据以上分析,最终 i
的值为 0
环境二
- MSVC
- Visual Studio 2022
具体如何在Visual Sudio中调试时生成汇编代码请自行检索。
根据上面的分析结果,最终i
的值是1
总结
如果以后碰见这样写的代码,对于 i
最终的结果没有必要进行纠缠,本身写出这样的代码就是没有意义的。