登陆论坛 找回密码 立刻获得20pp! 地图 帮助
宽带山生活
版主:

  • 主题内容
<< [1] 2 3 4 5 >>  [只看楼主]  [加入关注] 点击:881 回复:107 已被0人关注

主题:小问题:i++==i--?

349 0

来自:上海
注册:2001-12-16
发帖:49+604 
main()

{

int i=2;

if(i++==i--)printf("aaa\n");

printf("bbb\n");

}

谁能解释一下?




-------------------------------------------------------------------------------------------
编程中鸟,不断提高中...


格言:多花点时间陪女朋友吧!

发表于:2002-10-26 20:18:50
推荐:牙齿有问题,您找我! ...楼主...

钢盅郭子
732 3

来自:上海
注册:2001-03-19
发帖:622+11347 
(i ++) == i // 先取值后++

同样

(i --) == i // 先取值后--




-------------------------------------------------------------------------------------------
銀河の歴史は又一頁

发表于:2002-10-26 20:25:12

349 0

来自:上海
注册:2001-12-16
发帖:49+604 
那你认为这个程序输入的结果是什么呢?

我在turbo c中调试出的结果是bbb.




-------------------------------------------------------------------------------------------
编程中鸟,不断提高中...


格言:多花点时间陪女朋友吧!

发表于:2002-10-26 20:42:34
推荐:畅玩天下贰,精彩玄幻飞行 ...第2楼...

106 0

来自:上海
注册:2002-10-18
发帖:7+26 
本来就是这样啊

如果i=5,那么if(i++==i--)就是if(5==6)这个条件之后(i--)->i=5




-------------------------------------------------------------------------------------------
流水生生不息!

发表于:2002-10-26 21:53:27

107 0

来自:保密
注册:2002-09-02
发帖:10+358 
根据C++标准,这个等式是无意义的.




-------------------------------------------------------------------------------------------
http://www.allaboutprogram.com/raymond/


http://www.allaboutprogram.com/bb/

发表于:2002-10-26 22:58:32

349 0

来自:上海
注册:2001-12-16
发帖:49+604 
int a=2;

if(a++==a+1)

printf("aa");

else

printf("bb");



输出:bb




-------------------------------------------------------------------------------------------
编程中鸟,不断提高中...


格言:多花点时间陪女朋友吧!

发表于:2002-10-26 23:14:10
推荐:kds红日官网启动啦!!! ...第5楼...

107 0

来自:保密
注册:2002-09-02
发帖:10+358 
就像i=i++;一样,这样的语句,是无意义的,没必要讨论的。




-------------------------------------------------------------------------------------------
http://www.allaboutprogram.com/raymond/


http://www.allaboutprogram.com/bb/

发表于:2002-10-27 08:27:20

212 0

来自:上海
注册:2001-09-09
发帖:13+128 
i=++i+i++;

i等于几?



标准答案:i的值取决于编译器




-------------------------------------------------------------------------------------------
水不是这么灌di

发表于:2002-10-27 11:32:06

107 0

来自:上海
注册:2002-02-19
发帖:31+100 
应该结果是

aaa

bbb

i++==i--;这没有意义的,因为先判断i==i,再执行==和--的,

我想和编译器没什么关系吧.




-------------------------------------------------------------------------------------------
兄弟我先抛块砖,有玉的尽管砸过来。

发表于:2002-10-28 18:56:36
推荐:打造KDS最美贴,刹那芳华 ...第8楼...

174 0

来自:保密
注册:2002-07-11
发帖:53+289 
我特看不起那些老是说"这样的语句,是无意义的,没必要讨论的。"牛比烘烘的人.



其实,任何语句,只要编译器不报错,就是有讨论的必要的.



你以为,写编译器的问他们没有考虑这些语句吗?你知道他们为什么让这些语句编译通过吗?切!

不过学生就是这样,老以为自己如何如何,其实,你到社会上去看看,你那点东西有屁用.



-------------------------------------------------------------------------------------------
这个家伙很懒,什么也没留下......

发表于:2002-10-28 22:48:52

107 0

来自:保密
注册:2002-09-02
发帖:10+358 
to 君君:

C++标准(ISO 14882)上说,在一个sequence point里面,对同一个变量只能有一次写操作。如果同时有读操作的话,那么这个读操作必须是为写操作而进行的。如果一句语句违反了上面的规定,那么这句语句的结果是未定义的,也就是“无意义的”。

譬如说:

i=(i++)+(i++)+(i++);

这样的语句,就是无意义的。因为它修改了多次i的值。

你看不起我不要紧,等你年纪大一点会好的。

为你:$一下。

btw:有人说过,学计算机语言和学生活中的语言一样,如果一个人学不好一般语言,也学不好计算机语言。我以前还一直不能理解这句话。谢谢!!!!




-------------------------------------------------------------------------------------------
http://www.allaboutprogram.com/raymond/


http://www.allaboutprogram.com/bb/

发表于:2002-10-29 08:57:45

107 0

来自:保密
注册:2002-09-02
发帖:10+358 
忘了几件事情:

1.虽然我很向往学生生活,但是我早已不是学生了。

2.下次讨论问题最好对事,不要对人。

3.写编译器的对于未定义情况,可以以他们最“优化”的方式去考虑。导致各个编译器的结果是不一样的。对于一个写程序的人来说,应该避免使用这样的语句。




-------------------------------------------------------------------------------------------
http://www.allaboutprogram.com/raymond/


http://www.allaboutprogram.com/bb/

发表于:2002-10-29 09:07:29
推荐:本能寺之变 ...第11楼...

174 0

来自:保密
注册:2002-07-11
发帖:53+289 
这就更有必要讨论了。



你难道不认为编译器有问题吗?所以,你也不用着急!我只是希望你以后不要说类似的话而已。你以为你提到的那些,写编译器的人不知道吗?你知道他们为什么要让这些语句通过编译吗?



不要抱着几条条条杠杠就牛比烘烘的,何必呢!



如果你搞过硬件,学过机器语言,你就会真正理解什么是无意义指令,什么是非法指令,什么是无效指令,什么是非标准指令(不公开指令)。在高级语言的层次上,你永远无法明白的。



-------------------------------------------------------------------------------------------
这个家伙很懒,什么也没留下......

发表于:2002-10-29 09:13:24
推荐:爱尔给我的“重生” ...第12楼...

107 0

来自:保密
注册:2002-09-02
发帖:10+358 
编译器当然没问题。因为标准没规定的事情,编译器厂商可以自行决定,呵呵。

写编译器的人当然知道,呵呵。通过编译是因为这句话没有语法错误,但是由于结果是未定义的,还是不应该用它。

类似的话?什么话?

还有,我没说那是“指令”,呵呵。




-------------------------------------------------------------------------------------------
http://www.allaboutprogram.com/raymond/


http://www.allaboutprogram.com/bb/

发表于:2002-10-29 10:22:04

174 0

来自:保密
注册:2002-07-11
发帖:53+289 
难道标准允许“结果未定义的东西”?

你别搞笑了。而且能够通过编译,那么结果是必然的,唯一的,你怎么一点编译原理的知识也没有。



按照你的逻辑,那么今天的市场上就会没有螃蟹,因为没有人吃啊!



应不应该用是用户的问题,你难道说,因为汇编调试困难易出错,就不应该用汇编吗?



-------------------------------------------------------------------------------------------
这个家伙很懒,什么也没留下......

发表于:2002-10-29 11:07:59

174 0

来自:保密
注册:2002-07-11
发帖:53+289 
螃蟹这种古怪的东西,由于没有哪位祖先说过可以吃,而且吃下去结果不一定,所以,不应该吃。



哈哈,哈哈,downloadingdownloadingdownloadingdownloading



-------------------------------------------------------------------------------------------
这个家伙很懒,什么也没留下......

发表于:2002-10-29 11:10:43

382 0

来自:保密
注册:2000-11-22
发帖:20+721 


难道标准允许“结果未定义的东西”?





可惜事实摆在那里,C++ 标准中确实存在“结果未定义”的东西。如果你有兴趣,可以去看一看标准文本,第一节中就明确说明了什么是“undefined behaviour” ——— 简单的说,不同的编译器,甚至同一编译器的不同版本,对这样的语句可能有不同的解释 ——— 如果你没有这份东西,我可以发给你。





你别搞笑了。而且能够通过编译,那么结果是必然的,唯一的,你怎么一点编译原理的知识也没有。





我相信 lint386 和你一样学过编译原理,你这句话针对特定编译器的特定版本是对的,但是依赖这种东西写出来的程序非常脆弱 ——— 编译环境的小小改变都可能导致程序无法正确运行。



至于说到“牛比烘烘”,我觉得这个词形容你要比形容 lint386 合适,毕竟他只是指出事实,而你则是不停的在贬低别人 ——— 例子太多,恕不一一列举。




-------------------------------------------------------------------------------------------
Program is my incantation


Computer is my golem


Internet is my world of magic

发表于:2002-10-29 13:09:05

174 0

来自:保密
注册:2002-07-11
发帖:53+289 
我只是不认同他所说的“这样的语句,是无意义的,没必要讨论的”而已。



要是全部像他那样,就不用研究了,抱本破书,就可以解释全部了?



有句古话,叫“尽信书则不如无书”



对于“undefined behaviour”我根本认为它这种提法有问题。只能说,这种东西是暂时的。使需要解决的,要是像你们那样,就永远undefined了。



如你所说,那位试图推翻相对论的朋友是不是应该去跳楼啊!



不管你多么希望太阳时宇宙的中心,但是它不是。



如果对于标准的质疑,难道有什么不对的话。



-------------------------------------------------------------------------------------------
这个家伙很懒,什么也没留下......

发表于:2002-10-29 15:19:56

174 0

来自:保密
注册:2002-07-11
发帖:53+289 
虽然,妈妈从小就对你说,孩子,遇到障碍物要绕道走。

但妈妈毕竟老了。



-------------------------------------------------------------------------------------------
这个家伙很懒,什么也没留下......

发表于:2002-10-29 15:22:30

261 0

来自:上海
注册:2001-08-10
发帖:46+433 
楼上的简直胡搅蛮缠。downloadingdownloadingdownloadingdownloading



-------------------------------------------------------------------------------------------
白痴的签名方法啊?为什么只支持100字节,好烂的论坛。

发表于:2002-10-29 15:32:42
推荐:KDS红日球迷会2010招募公告 ...第19楼...

174 0

来自:保密
注册:2002-07-11
发帖:53+289 
我只是不认同他所说的“这样的语句,是无意义的,没必要讨论的”而已。



-------------------------------------------------------------------------------------------
这个家伙很懒,什么也没留下......

发表于:2002-10-29 15:57:55

105 0

来自:上海
注册:2002-02-28
发帖:15+337 
to 君君;

大家讨论问题,对事不对人,一上来就在这里叫嚣,有很多东西可能大家没有作好沟通,但不用这样吧。而且我相信lint386看编译原理比你懂的多,因为他已经在看E文原版了。OK?

修养不好的人,写出的代码和作品也好不到那里去,我没见过特例。如果你没钱买关于C++标准的书,大可以问这里的兄弟要份电子版本看完了再来这里讨论,好吗?而且下次发贴请象lint386一样举出实例和论点支持,——而不是一味的嘲讽和叫嚣,我们都知道类似这种妇女骂街的做法,对于说明问题是无用的。downloading



“牛比烘烘”??,不知道你是从那里学到的这个很蠢的词,但最好不要在这里用。呵呵



-------------------------------------------------------------------------------------------
世纷纷兮,心胡乱


霜寒寒兮,魂不归


诚烈烈兮,愁不化

发表于:2002-10-29 16:07:40

107 0

来自:保密
注册:2002-08-01
发帖:0+23 
本人利用BCB和VC6.0分别编译执行,结果入下:

(BCB)

bbb



(VC6)

aaa

bbb



{C++ 标准中确实存在“结果未定义”的东西

编译环境的小小改变都可能导致程序无法正确运行}

再次证明上述正确



To 君君:

先回家看看书,上上机编译一下看看执行结果了再说。




-------------------------------------------------------------------------------------------
天外飞虫

发表于:2002-10-29 16:24:01

105 0

来自:上海
注册:2002-02-28
发帖:15+337 
哇,我师傅老大也来了downloading



-------------------------------------------------------------------------------------------
世纷纷兮,心胡乱


霜寒寒兮,魂不归


诚烈烈兮,愁不化

发表于:2002-10-29 16:25:28

107 0

来自:保密
注册:2002-09-02
发帖:10+358 
其实正如你所说的,那些写标准的人和写编译器的人,比我们清楚。但是标准规定未定义情况是有原因的。



有的是为了编译器实现方便:

譬如说:j=(i++)+(i++)+(i++);这个等式。有的编译器可能中规中矩的,先把括号里的表达式计算出来(所以是依次计算3个i++)。但是有的编译器使用栈式表达式分析,可能在遇到第二个+的时候,就把前面的表达式计算了。



有的是为了优化方便:

譬如说,大家都注意到,构造函数是没有const型的,也就是说,const对象也是用普通构造函数来构造的。但是标准规定,如果一个const的object在其构造函数中,它的值如果不是通过this指针直接修改的话,会未定义。这是为了const optimization的需要。



当然,有些C++标准规定的未定义情况,可能每个编译器的结果都一样。

譬如:i=j=0;这句话其实是未定义的,但是没有一个编译器敢乱来。



此外,那些写编译器的人也不是完全清楚,否则也不会没有一个编译器是符合标准的。




-------------------------------------------------------------------------------------------
http://www.allaboutprogram.com/raymond/


http://www.allaboutprogram.com/bb/

发表于:2002-10-29 16:59:45

发表文章 回复文章
<< [1] 2 3 4 5 >>  [只看楼主]
回复主题 [ 返回 ]
主题: 小问题:i++==i--?
手机看宽带山

关于我们 - 联系我们 - 加入我们 - 营销服务 - 友情链接 - 频道合作- PChome Widget
Copyright © 1996-2009 PChome.net All rights reserved. 电脑之家 版权所有