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

时间:2012-02-25 16:39:35

标签: c c99 c89

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

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

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

2 个答案:

答案 0 :(得分:12)

没有。在表达式(a+b)-(a=b)中,在a子表达式中写入a(a+b)之间没有序列点,以确定要存储到{b的值1}}所以行为是未定义的。

答案 1 :(得分:8)

  

然而,这个表达式计算这个表达式的不同编译器或平台的顺序不是很重要吗?

  

使用此类代码是否安全?

不,这是未定义的行为。