我在java中编写一个循环。
我有2个整数dest& SRC。请查看内联问题。
void test() {
int[] arr = ..
for (...) { //iterate over the array here.
int src = arr[i];
int dest= arr[j];
if (dest != src) dest = src; //SHOULD I WRITE THIS?
OR
dest = src; //OR THIS?
..
}
}
答案 0 :(得分:3)
if(dest!= src)dest = src; 如果它们已经相等则有额外的比较
dest = src 如果它们已经相等则有一个额外的集合
我非常确定这些"额外内容"具有相同的复杂度O(1) 所以它真的应该没关系,我认为第二个选项(没有比较设置)看起来更清晰,但我认为在这一点上它只是一个意见问题。
答案 1 :(得分:2)
如果代码的语义正确,则应编写dest = src
。为什么?如果值不相等,if
子句仅设置值。但这意味着,如果该子句为假,则可以在不更改任何内容的情况下执行dest = src
(您只需重新分配该值)。 if
只会创建更多指令,无论如何都必须提取两个操作数。
j = i
并注释if
子句。
public class Main {
public static void main(String... args) {
int i = Integer.parseInt(args[0]);
int j = Integer.parseInt(args[1]);
// if (j != i) {
// j = i;
// }
j = i;
}
}
这是堆栈代码。
使用if
:
public static void main(java.lang.String...);
Code:
0: aload_0
1: iconst_0
2: aaload
3: invokestatic #16 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
6: istore_1
7: aload_0
8: iconst_1
9: aaload
10: invokestatic #16 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
13: istore_2
14: iload_2 // <-- Fetching 1st operand
15: iload_1 // <-- Fetching 2nd operand
16: if_icmpeq 21 // <-- THIS is the if
19: iload_1
20: istore_2
21: return
没有if
public static void main(java.lang.String...);
Code:
0: aload_0
1: iconst_0
2: aaload
3: invokestatic #16 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
6: istore_1
7: aload_0
8: iconst_1
9: aaload
10: invokestatic #16 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
13: istore_2
14: iload_1 // <-- Loading i
15: istore_2 // <-- setting i's value to j
16: return
如您所见,没有if
的版本需要13条说明。 if
需要14或16条指令。