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

las*_*and 4 c c99 c89

Cprogramming.com中,我发现了这段代码:

int a,b;
scanf("%d %d",&a,&b);
b=(a+b)-(a=b);
printf("%d %d",a,b);
Run Code Online (Sandbox Code Playgroud)

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

CB *_*ley 12

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


sep*_*p2k 8

但是,计算这个表达式的不同编译器或平台在这里的重要性如何?

是.

使用这样的代码是否安全?

不,这是未定义的行为.