【问题标题】:Would it be safe to do swap by "b=(a+b)-(a=b);"?通过“b =(a + b)-(a = b);”进行交换是否安全?
【发布时间】:2012-02-25 16:39:35
【问题描述】:

在Cprogramming.com我找到了这段代码:

int a,b;
scanf("%d %d",&a,&b);
b=(a+b)-(a=b);
printf("%d %d",a,b);

据称是“不使用临时交换”的提示/技巧。我在 Linux gcc 上的测试证明了这一点。但是,在这里计算这个表达式的不同编译器或平台的顺序不重要吗?使用这样的代码安全吗?

【问题讨论】:

  • 是的,因为使用临时变量是一件非常糟糕的事情!!!
  • 最近关于 "trick" 的讨论,扩展了 @DavidHeffernan 提到的内容。

标签: c c99 c89


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

是的。

使用这样的代码安全吗?

不,这是未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 2021-09-10
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多