鱼C论坛

 找回密码
 立即注册
查看: 1294|回复: 8

[已解决]i++求解

[复制链接]
发表于 2020-3-5 18:05:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
int main()
{
        int i;
        printf("%d %d %d",i=1,i+5,i++);
        return 0;
 } 
为什么输出是这样的呀
最佳答案
2020-3-5 19:07:02
这个问题出现过多次了,看这篇帖子里我的答案,在5楼

https://fishc.com.cn/forum.php?m ... 919&pid=4343099
capture_20200305180348946.bmp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-5 18:28:34 | 显示全部楼层
第四行的i没有定义吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 19:07:02 | 显示全部楼层    本楼为最佳答案   
这个问题出现过多次了,看这篇帖子里我的答案,在5楼

https://fishc.com.cn/forum.php?m ... 919&pid=4343099
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 19:35:19 | 显示全部楼层
我用VC6.0看了下汇编代码
printf函数是从右往左进行操作的,你会发现int i 之后,你直接i++,还有i+5,你都没有对i初始化,当然各种值都有可能
27:           printf("%d %d %d",i=1,i+5,i++);
0040F4B8 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040F4BB 89 45 F8             mov         dword ptr [ebp-8],eax
0040F4BE 8B 4D F8             mov         ecx,dword ptr [ebp-8]
0040F4C1 51                   push        ecx
0040F4C2 8B 55 FC             mov         edx,dword ptr [ebp-4]
0040F4C5 83 C2 05             add         edx,5
0040F4C8 52                   push        edx
0040F4C9 C7 45 FC 01 00 00 00 mov         dword ptr [ebp-4],1
0040F4D0 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040F4D3 50                   push        eax
0040F4D4 68 AC 2F 42 00       push        offset string "%d %d %d" (00422fac)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 22:12:56 | 显示全部楼层
不懂就不要这么用。
就算是懂也不要这么写程序,这样写出来程序可读性差,过段时间自己都看不懂了,而且容易造成逻辑混乱。
++,--这种运算尽量不要用在特别复杂的表达式中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 10:48:44 | 显示全部楼层
最好是定义在外面,Printf是从右往左按照栈顺序来操作的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 15:20:55 | 显示全部楼层
我运行了楼主的代码,打印的结果和你一样,下面来分析一下:1. int i;声明之后没有初始化,根据运行结果应该是将其自动初始化为0了。
2.printf函数是从右往左运算的,也就是说先算i++,由于i为0,所以i++的值也为0,但此时i == 1;
3.i + 5,当然就是1 + 5喽;
4.i = 1,其实你只写一个i也是一样的,也会打印1的
5.重点来了,虽然printf()函数是从右往左运算的,但是它的打印顺序依然是从左往右哦,你可以理解为先把要打印的东西计算了一遍(从右往左),再按计算出的值按顺序从左往右打印出来,就会出现楼楼的结果啦!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 16:03:38 | 显示全部楼层
major_lyu 发表于 2020-3-5 22:12
不懂就不要这么用。
就算是懂也不要这么写程序,这样写出来程序可读性差,过段时间自己都看不懂了,而且容 ...

就是突发奇想,试了一下,发现结果出乎我的意料谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 16:06:12 | 显示全部楼层
jzzc 发表于 2020-3-6 15:20
我运行了楼主的代码,打印的结果和你一样,下面来分析一下:1. int i;声明之后没有初始化,根据运行结果应 ...

明白明白,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 23:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表