| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 670 人关注过本帖
标题:菜鸟请教c 中自增自减的结合性的问题
只看楼主 加入收藏
jobf
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-8-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
菜鸟请教c 中自增自减的结合性的问题
1.i=0;i=(i++)+(i++)+(i++)+(i++);i=?
2.i=0;i=(++i)+(++i)+(++i)+(++i);i=?
3.i=0;i=(++i)+(++i)+(i++)+(i++);i=?
4.i=0;i=(i++)+(i++)+(++i)+(++i):i=?
2013-08-01 12:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
无聊的东东

DO IT YOURSELF !
2013-08-01 12:38
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
蛋疼...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-01 12:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
都是未定义行为,建议你Google一下“副作用与序列点”
2013-08-01 12:47
wuyu123
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-5-6
收藏
得分:0 
你这是有多无聊==、
2013-08-01 12:57
丶弱水彡千
Rank: 5Rank: 5
来 自:地狱十九层
等 级:职业侠客
威 望:2
帖 子:203
专家分:369
注 册:2013-6-16
收藏
得分:2 
i++  ++i  不管什么都要+1   就是看使用i了再加 还是加了在使用

这个怎么玩
2013-08-01 13:05
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:3 
这一类的东西没有什么实际性的意义啊,只要掌握原理就好。。。。

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-01 13:06
艺术的生活
Rank: 2
等 级:论坛游民
帖 子:51
专家分:77
注 册:2013-7-28
收藏
得分:4 
下次千万别再问这种问题了。
会被人骂死的。
给你一篇文章,好好看看。


(i++)+(++i)+(i++)之罪恶语句

我想,这里的读者一定会有大学生,你们在学C语言时,一定遇到过许多求“(i++)+(++i)+(i++)”之类的问题。昨天有人问我,令我一时语塞,研究了半天。今天我要告诉你们,这样的语句是罪恶的。你们也许要说,这明明是考试重点呀。别急,下面我们分成三个部分来组织:在第一部分中,解释为什么它有罪;第二部分,为了解救你们,我们找出解题规律;在第三部分中,给出几个更变态的题目,今后谁出这种题给你,你就用我这里的题目去问他。一. 这种语句的合法性C语言的创始人D.M.R在《CPL》中明确指出:自增与自减运算符只能作用于变量,类似于表达式(i+j)++是非法的。自增运算实际上包括了一个赋值运算,而表达式不能作赋值运算的左值,因为它没有确定的内存地址。只要你明白 (i+j)=5 是非法的,那就不难理解为什么(i+j)++非法。以此为依据,(i++)+(i++)这个语句中的后一项,是非法的。尽管看起来它只是一个i++,但别忘了,在前一个i++的作用下,后面的“i”本身就已经是表达式了,表达式不能再做++。一般地,在一个语句中,对同一个变量调用多次自增或自减运算,都是非法的。D.M.R还提醒,编译器应在这种情况下给出警告。事实上,gcc确实会对此给出一个:Warning: operation on ‘i’ may be undefined这已经够清楚了,无需多言。请编写教学大纲者注意,多年以来,你们一直在用非法语句作考试重点。二. 如何计算尽管它非法,但同学们没有执法权,只能任其蹂躏。所以,我们探索一下,编译器在摸不到头脑的情况下,是如何处理这个语句的。我们以 (i++)+(++i)+(++i)+(i++)+(i++) 为例,先将其编译成汇编代码,结果是这样的:addl -4(%rbp), %eaxmovl -4(%rbp), %eaxaddl -4(%rbp), %eaxincl -4(%rbp)addl -4(%rbp), %eaxaddl -4(%rbp), %eaxaddl -4(%rbp), %eaxincl -4(%rbp)incl -4(%rbp)incl -4(%rbp)为了照顾看不懂汇编的朋友,我把它直接对应着翻译成C语言。用变量sum表示要求的和,就是下面这个样子:i=i+1;sum=i;sum=sum+i;i=i+1;sum=sum+i;sum=sum+i;sum=sum+i;i=i+1;i=i+1;i=i+1这段代码能帮助你理解这个过程,我就不说了,留给你自己探索。下面直接给出我分析的结果:1. 先将所有的 i++ 改成 i ,然后在整个语句的最后,统一将 i 自增相应的次数(语句中有几个 i++,就在最后自增几次)。我们的例子,这时会变成 i+(++i)+(++i)+i+i; i++; i++; i++;2. 按照加法的结合性,先将左起前两项相加。如果前两项中含有 ++i,则先算 ++i;3. 前两项的和作为一项,与第三项相加,以此类推。同样,遇到 ++i,就先算 ++i。以上就是编译器处理这种语句的规律,当然,这并不是C语言定义的,只是编译器在出错情况下的无奈之举。大家可以用这个方法来解题,下面我就回答昨天一位同学问我的问题:i=5; 求 (i++)+(++i)+(i++) 的值按上面的方法做:1. 先把i++换到最后面,变成 i + (++i) + i ; i++; i++;2. 从左到右累加,先拿出前两项 i + (++i)。先算 ++i,i 的值变成6,两项相加得12;3、计算 12 +i,得18。三. 以牙还牙我们的教育者既然喜欢出这种题目,以我的分析,恐怕是有一种变态癖。既然这样,我就满足一下他们的胃口。读者朋友,以后谁给你出这种题,你就用下面的题目去问他。1. 写出下面语句的运行结果:printf("printf(%d)",printf("%d",printf("%d",printf)));2:写出下面函数的值int i=2;pow(i+(++i)+(i++), (i+(--i)+(i--), i+(++i)+(i--)));3:写出下面程序的运行结果main(){int x=0,y[14],*z=&y;*(z++)=0x46;*(z++)=y[x++]+0x0F;*(z++)=y[x++]-0x12;*(z++)=y[x++]+0x08;*(z++)=y[x]-0x4B;x=*(--z);while(y[x]!=NULL) putchar(y[x++]);}
2013-08-01 14:00
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:2 
我猜,printf那题答案是
printf(1)

yeah

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-01 14:45
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
收藏
得分:6 
楼主好好看看吧!
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-08-01 17:08
快速回复:菜鸟请教c 中自增自减的结合性的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018669 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved