我们可以对这些片段说些什么?

-3 c variables

1.

a=a+b; b=a-b; a=a-b;
Run Code Online (Sandbox Code Playgroud)

2.

b=a+b-(a=b);
Run Code Online (Sandbox Code Playgroud)

这两个片段交换'a'和'b'的值而没有临时的第三个变量.请忽略第二个陈述的完整性质.第二个陈述是否优于第一个陈述?怎么样?我们可以说第二个是最优的,因为它的陈述较少吗?

das*_*ght 6

这两种方法都不是通用的,因为您冒着数字溢出的风险a+b.由于C标准考虑了整数溢出未定义的行为,因此两个片段同样糟糕,并且在生产代码中是不可接受的.

最好的方法也是最易读的方法:

int tmp=a;
a=b;
b=tmp;
Run Code Online (Sandbox Code Playgroud)

您的代码的读者将立即看到正在发生的事情,这本身就足够了.然而,作为额外的奖励,大多数编译器也将看到您正在做什么,并tmp通过在可用的平台上使用交换指令来优化代码中的变量.

注意:有人可能会争辩说第二种方法更糟糕,因为a在具有副作用的表达式中使用了两次,而在两次使用之间没有序列点.这意味着允许编译器计算之前计算a=b并存储结果,即使赋值是添加之后.即使在没有整数溢出的情况下,这一系列操作的最终结果也是相同的.a a+ba=b