编译器对 变量值的读取顺序可能会不同,但对于操作符的运算顺序是 不会变的
也就是说 有可能 先计算出 a=b 中变量的值,但不会执行赋值运算。
编译器对一个优先级内的运算顺序是明确的,如果两个优先级相同,那么是否先执行哪个是未定义的
比如 (a^=b)+(b^=c) 这个里面 先计算括号内的哪个 是未定仪的
但对于a= (b= ( c=d))) 几个赋值运算并不在同一级别内,所以 肯定是先计算c=d,把值赋给b,如果已经计算过b的值,那么就会刷新了
我在VS VC Linux下的gCC还有TC 这样赋值都没问题
这个不属于基础吧,而且此问题并非我没有考虑过的,得出的结论就是可以交换
几个主流编译器没有歧义可以我才会用的
----------------解决方案--------------------------------------------------------
LS:
首先向你抱歉,那段代码未定义,和运算顺序无关。最大的愿意是,一行代码两个顺序点之间,两次改变一个变量的值。
具体请看我上面给出的资料。已经有人反应过了这行代码在有些编译器上面是无效的。
----------------解决方案--------------------------------------------------------
汗````` 抱歉虾米 你能把问题说出来 是对我有好处的啊
多墨迹才能明白其中原因啊~~~
b ^= a ^= b,a^=b;
这样的话 相信在任何编译器上都能交换了
一个表达式出来 出错 确实有理由的
----------------解决方案--------------------------------------------------------
恩,应该是可以的吧……不过因为学C++的原因,我还是喜欢三赋值的方法交换,毕竟不止是适合整型,而且适合任何类型,哈哈~~~
----------------解决方案--------------------------------------------------------
这个程序大可不必写这么多代码的
----------------解决方案--------------------------------------------------------
话说,其实挺赞yxw的代码的,写的真不错~~~
----------------解决方案--------------------------------------------------------
我会被吐沫星淹死的````
----------------解决方案--------------------------------------------------------
位运算只支持int和char。。还是交换好点。。。代码风格和翅膀的很像。。呵呵
----------------解决方案--------------------------------------------------------
广陵:
1 无错分析,是在真实的代码中使用的,而不是做题,题目已经给定数字不超过八位,就不需要再去判断。当然你加个断言也无可厚非。如果在OJ上,你随便输出多余消息,是要算WA的。
2 题目只有一个“输出”,所以只需要输出一个数字就可以了。对题意的理解很重要。
----------------解决方案--------------------------------------------------------
回复 12# 的帖子
可不可以直接写 *(p+i)>=10 而不用>=58?[[it] 本帖最后由 jxt598598 于 2008-5-20 22:28 编辑 [/it]]
----------------解决方案--------------------------------------------------------