鱼C论坛

 找回密码
 立即注册
查看: 5282|回复: 11

i++和++i的区别

[复制链接]
发表于 2013-7-31 16:45:16 | 显示全部楼层 |阅读模式
1鱼币
#include<stdio.h>
int main(void)
{
int i = 5, j = 5, p, q;
p = (i++) + (i++) + (i++);
q = (++j) + (++j) + (++j);
printf("%d,%d,%d,%d",p,q,i,j);
return 0;
}
说明一下p,q,i,j的值,为什么我编译q的值是22,书上所说的是24?到底是哪一个?请高手指点,请说明详细原因!

最佳答案

查看完整内容

编译器不同,结果可能不同。编译器优化后,指令变成了乱序执行。 使用VC6.0 q的值是22 分号是一个顺序点 尽量少使用这种多个自增的语句 不然会被编译器修改了值 定义变量的只能加上volitle防止编译器修改值. 区别就是后置i++直接算出p的值,p=5+5+5=15 前置++i 先i先自增两次i=7,再相加7+7=14,接着自增i=8,再相加 q=7+7+8=22 刚才用vs2010使用c++编译器编译的结果 q 为24,可见C和C++编译器处理方式不同,VC6.0 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 16:45:17 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-7-31 20:45 编辑

编译器不同,结果可能不同。编译器优化后,指令变成了乱序执行。
使用VC6.0 q的值是22
分号是一个顺序点
尽量少使用这种多个自增的语句   不然会被编译器修改了值   定义变量的只能加上volitle防止编译器修改值.

区别就是后置i++直接算出p的值,p=5+5+5=15
前置++i 先i先自增两次i=7,再相加7+7=14,接着自增i=8,再相加 q=7+7+8=22

刚才用vs2010使用c++编译器编译的结果 q 为24,可见C和C++编译器处理方式不同,VC6.0使用的是.c,VS2010使用的是.cpp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-31 19:16:09 | 显示全部楼层
是不是编译器有问题啊?还是有BUG啊!我想了一下午都没搞定,谁帮我啊:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2013-7-31 19:50:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-31 19:57:04 | 显示全部楼层
编译器应该没问题啊!如果q = (++j) + (++j);结果就会正确q的值14,q = (++j) + (++j) + (++j);结果就变成22,问题就出现在这里!我就一直没弄明白这个原因!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-2 11:08:46 | 显示全部楼层
一个是加一后搓泥  一个是处理后加一
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-2 19:58:01 | 显示全部楼层
有意思{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-6 09:46:44 | 显示全部楼层
没想到两个++的前后区别这么大。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-6 09:59:40 | 显示全部楼层
分类: 前自增 --  ++i
          后自增 --  i++
相同: 最终都是i的值加1
不同:前自增整体表达式的值是i加1之后的值
         后自增整体表达式的值是i加1之前的值  
我是C新手米以上内容是郝斌C语言有讲到的区别,记不清哪一课了,这是我做的笔记   希望能帮到你
                                
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-6 13:55:49 | 显示全部楼层
领教了,真的是大神多多啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-8 23:56:31 From FishC Mobile | 显示全部楼层
有一点我想说.我的18,21,8,8.请教下,咋个编译器不同,连运算方式都变了:dizzy::dizzy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-9 00:10:44 From FishC Mobile | 显示全部楼层
#include<stdio.h>
int main(void)
{
int i = 5, j = 5, p, q;
p = (i++/*5*/) + (i++/*6*/) + (i++/*7*/);
//括号里面的是先赋值再自加1的p=5+6+7=18
q = (++j/*6*/) + (++j/*7*/) + (++j/*8*/);
//括号里面的是先自加1然后再参于运算的q=6+7+8=21
printf("%d,%d,%d,%d",p,q,i,j);
//正如前面所说反正结果都是8
return 0;
}
//不明白的是,i++,先赋值再运算,那么它是把值赋给它自己了吗?作为单独的代码,而不是类似y=i++的话.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 15:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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