C/C++中由于语义不明确为引发的血案,(关于 i = i++的问题),带你理解本质

文章探讨了在gcc和MSVC编译器下,代码`i=i++;`执行后变量i的值如何因编译器差异而不同。通过查看汇编代码,作者指出在gcc环境下i的值为0,而在MSVC环境下为1,强调这类代码的不确定性并建议避免使用。
摘要由CSDN通过智能技术生成

声明

该问题本身没有多大意义,但是看到网上有人问这个问题,我和另一个小伙伴也没在网上找到有很本质的解释,所以浅浅探索了一下。
该问题在不同的编译器上,最终 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 最终的结果没有必要进行纠缠,本身写出这样的代码就是没有意义的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值