关于 i++ 与 ++i 的讨论
tearfly吧
全部回复
仅看楼主
level 5
由于表达式的求值顺序并非完全由操作符的优先级决定,因此有了以下讨论:i + --i 的结果是多少?操作符的优先级规则要求自减运算在加法运算之前进行,但我们没有办法得知加法操作符的左操作数是在右操作数之前还是之后进行求值.由于自减操作符具有副作用.--i 在 i 之前或之后执行,表达式的结果在两个情况下将会不同.标准说明类似这种表达式的值是未定义的.尽管每种编译器都会为这个表达式产生某个值,但到底哪个是
正确的
并无标准答案.因此,像这样的表达式是不可移植,应该予以避免.下面这个程序将说明这个问题.//bad_exp.c#include
main(){ int i = 10; i = i-- - --i * ( i = - 3 ) * i++ + ++i; printf( "i = %d\n", i );}非法表达式结果:值 编译器-128 Tandy 6000 Xenix 3.2-95 Think C 5.02( Macintosh )-86 IBM PowerPC AIX 3.2.5-85 Sun Sparc acc( K&C编译器 )-63 gcc,HP_UX 9.0, PowerC.2.04 Microsoft C++ 7.021 Turbo C/C++ 3.0, Turbo C/C++ 4.522 FreeBSD 2.1R30 Dec Alpha OSF1 2.036 Dec VAX/VMS42 Microsoft 5.1你可以看到结果如此戏剧性.许多编译器由于是否添加了优化措施而导致结果不同.例如:在gcc中使用了优化器后,程序的值从-63变成了22.尽管每个编译器以不同的顺序计算这个表达式,但你不能说任何一种方法是错误的!这是由于表达式本身的缺陷引起的,由于它包含了许多具有副作用的操作符,因此它的求值顺序存在歧义.以下表达式,你可以在你的C编译器试验一下:i = ( i-- ) + ( ++i );i = j + j++;k *= k++;以下为C++的:你能遇见他们的结果吗?cout<<++( ++i )<< ',' << i<
2005年10月03日 04点10分 1
level 0
支持!!!!我顶
2005年10月03日 12点10分 2
level 0
的确不一样啊~~~
2005年10月06日 01点10分 3
level 0
这个怎么这么冷清???顶一下
2005年10月12日 12点10分 4
level 0
这种可读性这么差的程序,研究出来又有虾米意思?只能作为艺术来欣赏一下,真正写程序的时候,括弧该加的还是加上的好
2005年10月13日 15点10分 5
level 0
仁者见仁仁啊
2005年10月14日 01点10分 6
level 0
这个B呀,算什么程序,
2005年10月15日 13点10分 7
level 0
那么请问++++i+++++i++-++i+++++i+++++是什么呀,楼主?
2005年10月15日 13点10分 8
level 5
回5楼:北京邮电大学 学13楼的同学研究的目的是说明:表达式的求值顺序并非完全由操作符的优先级决定回7、8楼:河南省洛阳市 洛阳师范高等专科学校的同学不要乱写 ++++i+++++i++-++i+++++i+++++ 之类的式子,我想你也是随便写的吧,你能让它运行通过吗?你分清操作符的左右操作数了吗?我想洛阳师范高等专科学校的学生不至于都出口成“脏”吧!还是,文明一点好,不要砸了你们学校的招牌!
2005年10月15日 14点10分 9
level 1
你 怎么知道他们是那儿的呢?牛!!~哇塞```好帅```问一下是破解ip查出来的```教教我啦 我很愿意努力学习技术```我qq395760163
2005年10月16日 07点10分 10
level 0
加我QQ拉395760163我很缺像你这种有技术的人辅导辅导会遇见的问题好想学哦~—~!
2005年10月16日 07点10分 11
level 1
楼主我想成为你朋友qq395760163学东西
2005年10月16日 07点10分 12
level 5
~o~呵呵~~~你是 成都信息工程学院 本部的学生 对吗?有什么问题给我留言就可以了现在工作很忙,没有时间上线
2005年10月16日 07点10分 13
level 1
你好强~~!我要向你学习加我嘛~~哥哥``加我嘛你好强~~~我要你`~~!你好猛``太强悍了你是我见过的最``最``最勇猛的```!!其实你很不错至少看穿了我的心思前面我故意留的IP``然后就```呵呵强```太强```
2005年10月17日 04点10分 14
level 1
加我拉```你没看见啊我在好多地方都留了就怕你看不见拉``5555```不要拉````395760163你是不是将长期做吧主呢?
2005年10月17日 05点10分 15
level 0
晕死,不至于哦
2005年10月17日 07点10分 16
level 0
我呸,天天研究回字有几种写法的人也算高手?!去死吧
2005年10月28日 01点10分 17
level 0
尽管后缀自加和后缀自减操作符 ++ 和 -- 在输出其旧值之后才会执行运算, 但这里的``之后"常常被误解。没有任何保证确保自增或自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表达式 ``完成" (按照 ANSI C 的术语, 在下一个 ``序列点" 之前, 参见问题 3.7) 之前的某个时刻进行。本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自增运算。 包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, ``多个不确定副作用" 是指在同一个表达式中使用导致同一对象修改两次或修改以后又被引用的自增, 自减和赋值操作符的任何组合。这是一个粗略的定义; 严格的定义参见问题 3.7, ``未定义" 的含义参见问题 11.32。) 甚至都不要试图探究这些东西在你的编译器中是如何实现的 (这与许多 C 教科书上的弱智练习正好相反); 正如 K&R 明智地指出, ``如果你不知道它们在不同的机器上如何实现, 这样的无知可能恰恰会有助于保护你。http://free3.e-168.cn/antigloss/cpp/
2005年10月28日 08点10分 18
level 0
IP是怎么查出来的?
2005年11月14日 13点11分 19
level 0
随便找个查IP的网站就可以了三
2005年11月17日 04点11分 20
1