示例:交换两个nos的简单程序.
int a = 10;
int b = 20;
a = a+b;
b = a-b;
a = a-b;
Run Code Online (Sandbox Code Playgroud)
现在在下面的代码中:
a=a+b-(b=a);
Run Code Online (Sandbox Code Playgroud)
我的意思是这两个代码有什么区别?
另外:如果这两个的加法超过了整数的合法限制,这在Java和C++的情况下有什么不同呢?
这些都不适合我.可读性是关键.如果要交换值,最明显的方法是通过临时值:
int a = 10;
int b = 20;
int tmp = a;
a = b;
b = tmp;
Run Code Online (Sandbox Code Playgroud)
我既不知道也不会关心这是否与涉及算术的"聪明"方法一样有效.在有人证明在实际应用程序中性能差异很大之前,我的目标是使用最简单的代码.不只是在这里,而是所有代码.确定您需要执行的程度(以及在什么维度上),测试它,并将其更改为更复杂但有效的(如果需要).
(当然,如果您的平台上有swap可用的操作,请使用它...更清楚.)
在C++中,代码产生未定义的行为,因为没有序列点a+b-(b=a),你正在改变b它并从中读取.
你最好使用std::swap(a,b)它,它是针对速度进行优化的,比你拥有的更具可读性.
由于您的特定代码已经被评论过,我只想添加一个方面.编写一个衬垫并不重要,因为在指令级别,您无法避免将程序集转换为机器代码的步骤数.大多数编译器已经相应地进行了优化.
也就是说,除非一个内联实际上使用不同的机制来实现目标,例如在交换两个变量的情况下,如果你不使用第三个变量并且可以避免所有障碍,例如类型溢出等,并使用按位运算符例如,那么您可能已经保存了一个内存位置,从而可以访问它.
在实践中,这几乎没有价值,并且在可读性方面存在问题,如其他答案中已经提到的那样.专业课程需要由人们维护,以便他们易于理解.
良好代码的一个定义是Code实际上做了它似乎正在做的事情
即使你自己会发现很难修复你自己的代码,如果它是根据一些缩短但复杂的操作巧妙地编写的.应始终优先考虑可读性,并且大多数时候,真正需要的效率来自改进设计,方法或更好的数据结构/算法,而不是简短的一个衬里.
引用Dijkstra:有能力的程序员完全了解自己头骨的有限尺寸.因此,他完全谦卑地接近他的任务,并避免像瘟疫一样聪明的伎俩.
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |