i++和++i
本帖最后由 无符号整形 于 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循环中还是一样的 01028 mov dword ptr ,0
0040102F jmp main+2Ah (0040103a)
00401031 mov eax,dword ptr
00401034 add eax,1
00401037 mov dword ptr ,eax
0040103A cmp dword ptr ,2
0040103E jge main+32h (00401042)
00401040 jmp main+21h (00401031)
6: for(j = 0;j < 2;++j);
00401042 mov dword ptr ,0
00401049 jmp main+44h (00401054)
0040104B mov ecx,dword ptr
0040104E add ecx,1
00401051 mov dword ptr ,ecx
00401054 cmp dword ptr ,2
00401058 jge main+4Ch (0040105c)
0040105A jmp main+3Bh (0040104b)
这个用VC 写出来是 2,2
阁龙1427 发表于 2016-7-18 15:59
这个用VC 写出来是 2,2
我的gcc好像是不同的 这个从汇编代码上看运行过程是一样的
但是a=i++;
a=++j;
就是不一样
阁龙1427 发表于 2016-7-18 16:01
这个从汇编代码上看运行过程是一样的
但是
嗯,是很奇怪 阁龙1427 发表于 2016-7-18 16:01
这个从汇编代码上看运行过程是一样的
但是
好像我错了啊,也是2,2
已经改过来了 无符号整形 发表于 2016-7-18 16:00
我的gcc好像是不同的
我用gcc 编译了,也是2,2,所以你说的逻辑有漏洞。咋情况 阁龙1427 发表于 2016-7-18 17:23
我用gcc 编译了,也是2,2,所以你说的逻辑有漏洞。咋情况
不知道,是自己不严谨 本帖最后由 过眼云烟 于 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编程,编写个程序,我听说,不同的编译器判断的结果是不同的,这是正常现象(我没有实际测试过,不清楚,我用一个编译器用了很多年,习惯了,别的编译器我没试过),曾经有大神解释过这个问题,但是我限于水平有限,我也不知道该怎么说,我在实际编程(非考试编程题)的过程中,是尽量避免这种问题的。
刚才在我电脑上的编译器实验了一下,证明了我之前的结果
好像跟楼主的不完全一样哈,单纯的i++和++i,如果是“独立成句”(在for循环中也一样)那么是完全没有任何区别的,如果结合式子来计算,比如说,sum = i++;那么必须理解为,sum=i;i++也就是说,先计算sum=i再计算i++而sum = ++i;就是,先计算++i再计算sum=i当初我们坑爹考试把我绕晕了,我一直也搞不懂,直到我遇到了一个神奇的老师,告诉了我这个方法,不仅便于理解,也彻底搞清楚了这个问题,但是这个方法还是仅限于考试哈,实际编程我可不敢保证绝对正确哈。
页:
[1]