游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6173|回复: 23

问一个关于i++的幼稚问题

[复制链接]

37

主题

727

帖子

740

积分

高级会员

Rank: 4

积分
740
发表于 2004-10-5 23:30:00 | 显示全部楼层 |阅读模式
这个问题
我朋友说的和谭浩强那本C语言程序设计第二版不同
i++执行后,是不是同一函数所有i都加1?

int i=3
printf ("%d,%d",i,i++)

这个输出结果是不是 4 3
书上说的,我也能理解
原因是 参数的执行是右到左,i++输出3,而到i时,已经加1了
所以是 4 3
但群组里有人说是 3 4
请各位前辈给我说一下

并且讲讲i++的用处和你们平时用的经验
谢谢!!!

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-10-6 00:50:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

输出应该是3, 3
push不算单独一条语句的,i++是在执行完这一条语句之后的下一条语句++的,你把你自己的代码汇编跟一下就知道了。

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2004-10-6 01:32:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

以下只适用debug中
在vc7.1中
结果是
4,3

printf ("%d,%d %d",i++,i++,i++);
这个是
5,4,3
printf ("%d,%d %d",i++,i,i++);
这个是
4,5,3

基础知识 i++ 构造了一个拷贝 然后再自加一
而++i没有拷贝

这就很好玩了
printf ("%d,%d %d",i++,i,i++);
估计是从右向左计算参数,
首先 最右面 i++
构造一个拷贝i  我们叫 i1 吧 值为 3
然后 i+=1; i值为4

中间不操作

最左面 i++
构造另外一个拷贝 就叫做i2吧 值为4
然后i+=1;i值为5

最后显示
三个其实数分别是  i2,i,i1
也便是   4,5,3了

因为i++要构造拷贝 所以比++i效率差
在能通用的时候尽量使用++i 特别是在大对象时候节省效率明显

printf ("%d,%d %d,%d,%d",i++,i++,++i,i,i++);
猜猜这个显示什么
编译一下看看是不是想的结果

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-10-6 01:40:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

  . . .
难道说这就是c和c++的不兼容性之一?
没用过c,可是想潭好强也是著名教授,应该不会出错.
c++里的规定是后++在语句之后加,前++在语句之前加,
不知道c里面是怎么规定的呀?

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-10-6 01:41:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

?真的假的啊?我的也是vc7.1啊?怎么会这样?我是统一加的

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-10-6 01:42:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

        int i = 3;
        printf(" %i, %i",i,++i);
结果         4 4
        int i = 3;
        printf(" %i, %i",i,i++);
结果    3 3

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2004-10-6 01:43:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

i++
是构造一个i的无名拷贝用来负值,
++i没有拷贝
如果重载过++操作符号的话  就能看到两种++不同的实现方法了

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-10-6 01:47:00 | 显示全部楼层

Re: Re:问一个关于i++的幼稚问题

tarkey: Re:问一个关于i++的幼稚问题

输出应该是3, 3
push不算单独一条语句的,i++是在执行完这一条语句之后的下一条语句++的,你把你自己的代码汇编跟一下就知道了。


我的vc2003上是这么实现的.
我记得c++标准是这样规定的啊
后++在语句之后加,前++在语句之前加,

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2004-10-6 01:47:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

#include<iostream>//(可能是这个库的问题,C++的库是面向对象的,C的库可能就不一样)
void main()
{
int i=3;
printf ("%i,%i ",i,i++);
}
结果
4,3

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-10-6 01:51:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

...晕了,可以把的反汇编贴出来看看吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-22 15:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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