学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
发新话题
打印

求解,高手进

既然 对 a= (b= ( c=d))) 没意见 那就好说了

编译器对 变量值的读取顺序可能会不同,但对于操作符的运算顺序是 不会变的

也就是说  有可能 先计算出 a=b 中变量的值,但不会执行赋值运算。
编译器对一个优先级内的运算顺序是明确的,如果两个优先级相同,那么是否先执行哪个是未定义的

比如 (a^=b)+(b^=c)   这个里面 先计算括号内的哪个 是未定仪的

但对于a= (b= ( c=d)))  几个赋值运算并不在同一级别内,所以 肯定是先计算c=d,把值赋给b,如果已经计算过b的值,那么就会刷新了

我在VS VC Linux下的gCC还有TC 这样赋值都没问题  

这个不属于基础吧,而且此问题并非我没有考虑过的,得出的结论就是可以交换
几个主流编译器没有歧义可以我才会用的
How are you 怎么是你?
How old are you   怎么老是你?

TOP

LS:
首先向你抱歉,那段代码未定义,和运算顺序无关。最大的愿意是,一行代码两个顺序点之间,两次改变一个变量的值。
具体请看我上面给出的资料。已经有人反应过了这行代码在有些编译器上面是无效的。
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

汗`````  抱歉虾米   你能把问题说出来 是对我有好处的啊

多墨迹才能明白其中原因啊~~~

b ^= a ^= b,a^=b;

这样的话 相信在任何编译器上都能交换了

一个表达式出来 出错  确实有理由的
How are you 怎么是你?
How old are you   怎么老是你?

TOP

恩,应该是可以的吧……不过因为学C++的原因,我还是喜欢三赋值的方法交换,毕竟不止是适合整型,而且适合任何类型,哈哈~~~
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

这个程序大可不必写这么多代码的
大家一起来编程吧!

TOP

话说,其实挺赞yxw的代码的,写的真不错~~~
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

我会被吐沫星淹死的````  
How are you 怎么是你?
How old are you   怎么老是你?

TOP

位运算只支持int和char。。还是交换好点。。。代码风格和翅膀的很像。。呵呵
学习需要安静。。海盗要重新来过。。

TOP

广陵:
1 无错分析,是在真实的代码中使用的,而不是做题,题目已经给定数字不超过八位,就不需要再去判断。当然你加个断言也无可厚非。如果在OJ上,你随便输出多余消息,是要算WA的。
2 题目只有一个“输出”,所以只需要输出一个数字就可以了。对题意的理解很重要。
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

回复 12# 的帖子

可不可以直接写 *(p+i)>=10  而不用>=58?

[ 本帖最后由 jxt598598 于 2008-5-20 22:28 编辑 ]
qq:304742297

TOP

发新话题