通过“b=(a+b)-(a=b);”进行交换安全吗?
在Cprogramming.com中我发现了这段代码:
int a,b;
scanf("%d %d",&a,&b);
b=(a+b)-(a=b);
printf("%d %d",a,b);
据称是“不使用临时交换”的提示/技巧。我在 Linux gcc 上的测试证明了这一点。但是,不同编译器或平台计算该表达式的顺序在这里不重要吗?使用这样的代码安全吗?
In Cprogramming.com I found this piece of code:
int a,b;
scanf("%d %d",&a,&b);
b=(a+b)-(a=b);
printf("%d %d",a,b);
It is claimed to be a tip/trick to "swap without using temporary". My tests on Linux gcc prove it. However, wouldn't the order how different compilers or platforms computing this expression matters here? Is it safe to use such code?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不会。在表达式
(a+b)-(a=b)
中,写入的a
和写入的a
之间没有序列点读取(a+b)
子表达式以确定要存储到b
的值,因此行为未定义。No. In the expression
(a+b)-(a=b)
there is no sequence point betweena
being written to anda
being read in the(a+b)
sub-expression to determine the value to be stored tob
so the behaviour is undefined.是的。
不,这是未定义的行为。
Yes.
No, it's undefined behavior.