当前位置: 代码迷 >> C语言 >> 求解,高手进
  详细解决方案

求解,高手进

热度:105   发布时间:2008-05-20 10:02:09.0
既然 对 a= (b= ( c=d))) 没意见 那就好说了

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

也就是说  有可能 先计算出 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]]
----------------解决方案--------------------------------------------------------
  相关解决方案