通过“b=(a+b)-(a=b);”进行交换安全吗?

发布于 2025-01-08 18:56:16 字数 307 浏览 0 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

胡大本事 2025-01-15 18:56:16

不会。在表达式 (a+b)-(a=b) 中,写入的 a 和写入的 a 之间没有序列点读取 (a+b) 子表达式以确定要存储到 b 的值,因此行为未定义。

No. In the expression (a+b)-(a=b) there is no sequence point between a being written to and a being read in the (a+b) sub-expression to determine the value to be stored to b so the behaviour is undefined.

旧话新听 2025-01-15 18:56:16

但是,不同编译器或平台计算此表达式的顺序在这里不重要吗?

是的。

使用这样的代码安全吗?

不,这是未定义的行为。

However, wouldn't the order how different compilers or platforms computing this expression matters here?

Yes.

Is it safe to use such code?

No, it's undefined behavior.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文