鱼C论坛

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

[技术交流] i++和++i

[复制链接]
发表于 2016-7-18 15:47:13 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 无符号整形 于 2016-7-18 16:05 编辑

这是一个比较纠结的问题,在不同的情况下作用会不同(欢迎补充)
1.一般情况
看一下这个程序
#include<stdio.h>
int main()
{
        int i, j;
        i=0, j=0;
        sum = i++;
        printf("%d,%d\n", sum, i);
        sum1 = ++j;
        printf("%d,%d", sum1,j);
        
}
运行 会输出
1,1
1,1
这表示i++和++i在一般情况下是完全相同的
2.for循环
再看一下这个程序
#include<stdio.h>
int main()
{
        int i, j;
        for(i = 0;i < 2;i++);
        for(j = 0;j < 2;++j);
        printf("%d,%d", i, j);
}
会输出
2,2
表示第一个执行了2次,第二个执行了2次
这说明I++和++I在for循环中还是一样的

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +9 收起 理由
拈花小仙 + 5 + 5 + 4 感谢楼主无私奉献!
康小泡 + 5 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-18 15:59:08 | 显示全部楼层
01028   mov         dword ptr [ebp-4],0
0040102F   jmp         main+2Ah (0040103a)
00401031   mov         eax,dword ptr [ebp-4]
00401034   add         eax,1
00401037   mov         dword ptr [ebp-4],eax
0040103A   cmp         dword ptr [ebp-4],2
0040103E   jge         main+32h (00401042)
00401040   jmp         main+21h (00401031)
6:                for(j = 0;j < 2;++j);
00401042   mov         dword ptr [ebp-8],0
00401049   jmp         main+44h (00401054)
0040104B   mov         ecx,dword ptr [ebp-8]
0040104E   add         ecx,1
00401051   mov         dword ptr [ebp-8],ecx
00401054   cmp         dword ptr [ebp-8],2
00401058   jge         main+4Ch (0040105c)
0040105A   jmp         main+3Bh (0040104b)
这个用VC 写出来是 2,2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-18 16:00:33 | 显示全部楼层
阁龙1427 发表于 2016-7-18 15:59
这个用VC 写出来是 2,2

我的gcc好像是不同的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-18 16:01:13 | 显示全部楼层
这个从汇编代码上看运行过程是一样的
但是
a=i++;
a=++j;
就是不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-7-18 16:03:02 | 显示全部楼层
阁龙1427 发表于 2016-7-18 16:01
这个从汇编代码上看运行过程是一样的
但是

嗯,是很奇怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-18 16:06:23 | 显示全部楼层
阁龙1427 发表于 2016-7-18 16:01
这个从汇编代码上看运行过程是一样的
但是

好像我错了啊,也是2,2
已经改过来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-18 17:23:58 | 显示全部楼层
无符号整形 发表于 2016-7-18 16:00
我的gcc好像是不同的

我用gcc 编译了,也是2,2,所以你说的逻辑有漏洞。咋情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-18 17:24:59 | 显示全部楼层
阁龙1427 发表于 2016-7-18 17:23
我用gcc 编译了,也是2,2,所以你说的逻辑有漏洞。咋情况

不知道,是自己不严谨
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-20 17:15:18 | 显示全部楼层
本帖最后由 过眼云烟 于 2016-7-20 17:43 编辑

关于++i和i++,我曾经下苦功研究过,在编译器上试验过,也问过很多老师,在贴吧上也是冒着被封禁的风险问过,我对这个问题自认为有了一定的把握,我斗胆来说一些楼主的这个,如果我说的有问题,希望看帖的大神多多包涵。不要喷我哈。比如说,a=b++ + ++c我们老师给出的,考试用的标准解法是这样看待的:把语句开拆分成三个句子,(1)++c;(2)a=b+c;(3)b++;计算顺序就是式子编号,也就是说加号在字母前面的,就写在a=b+c这个式子的前面,先计算,加号在字母后面的,就写在a=b+c这个式子的后面,后计算。
也就是说,如果b=1,c=1,求a=b++ + ++c那么就是,先算式子(1)++c为2,然后计算a=b+c,a为3,然后计算b++为2,不知道能不能看懂?这是考试用的,也仅限于一些坑爹的考试,事实上大型的标准考试是不会这样考的,现在也很少会有考试考这种问题的。
如果是你想用C编程,编写个程序,我听说,不同的编译器判断的结果是不同的,这是正常现象(我没有实际测试过,不清楚,我用一个编译器用了很多年,习惯了,别的编译器我没试过)曾经有大神解释过这个问题,但是我限于水平有限,我也不知道该怎么说,我在实际编程(非考试编程题)的过程中,是尽量避免这种问题的。
刚才在我电脑上的编译器实验了一下,证明了我之前的结果 结果.png 结果2.png
好像跟楼主的不完全一样哈,单纯的i++和++i,如果是“独立成句”(在for循环中也一样)那么是完全没有任何区别的,如果结合式子来计算,比如说,sum = i++;那么必须理解为,sum=i;i++也就是说,先计算sum=i再计算i++而sum = ++i;就是,先计算++i再计算sum=i当初我们坑爹考试把我绕晕了,我一直也搞不懂,直到我遇到了一个神奇的老师,告诉了我这个方法,不仅便于理解,也彻底搞清楚了这个问题,但是这个方法还是仅限于考试哈,实际编程我可不敢保证绝对正确哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 06:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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