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'的值而没有临时的第三个变量.请忽略第二个陈述的完整性质.第二个陈述是否优于第一个陈述?怎么样?我们可以说第二个是最优的,因为它的陈述较少吗?
这两种方法都不是通用的,因为您冒着数字溢出的风险a+b
.由于C标准考虑了整数溢出未定义的行为,因此两个片段同样糟糕,并且在生产代码中是不可接受的.
最好的方法也是最易读的方法:
int tmp=a;
a=b;
b=tmp;
Run Code Online (Sandbox Code Playgroud)
您的代码的读者将立即看到正在发生的事情,这本身就足够了.然而,作为额外的奖励,大多数编译器也将看到您正在做什么,并tmp
通过在可用的平台上使用交换指令来优化代码中的变量.
注意:有人可能会争辩说第二种方法更糟糕,因为a
在具有副作用的表达式中使用了两次,而在两次使用之间没有序列点.这意味着允许编译器在计算之前计算a=b
并存储结果,即使赋值是在添加之后.即使在没有整数溢出的情况下,这一系列操作的最终结果也是相同的.a
a+b
a=b