3

我正在研究代码最小化和增强。我的问题是:是否可以在不破坏代码逻辑的情况下交换上面的 if 语句?

    int c1 = Integer.parseInt(args[0]) ;
    int c2 = Integer.parseInt(args[1]) ;
    int c3 = Integer.parseInt(args[2]) ;

    if (c2-c1==0)
      if ( c1 != c3 )

由于在这两个 if 语句之间没有写入变量的操作,我会说是,但我不确定。

有任何想法吗?

4

5 回答 5

10

我真的不明白你为什么想要(c2 - c1 == 0)而不是c1 == c2

为什么不去

if ((c1 == c2) && (c1 != c3)){
  do_stuff();
}

或者

if ((c1 != c3) && (c1 == c2)){
  do_stuff();
}

路线

请注意,在任何地方将 c1 切换为 c2 都没有任何惩罚或优势。在上述情况中,将最有可能失败的条件放在首位稍微更有效,因为如果第一个条件失败,则不会评估第二个条件。

另请注意,这是一个微优化,您永远不应该考虑速度。

第三个注意事项,如果你的程序没有做任何其他事情,并且如果这个条件不成立就退出,并且你真的想要微优化(你不这样做)我建议不要在你知道它们之前解析参数需要。如果 c1 在大多数情况下不等于 c2,那么您可以等待解析 c3,直到您知道必须检查它。这是严格的理论。在实践中不要这样做,因为它会使你的代码更难阅读。尽快将所有命令行变量处理为合理的东西要清楚得多。

于 2010-10-31T08:26:35.273 回答
3
int c1 = Integer.parseInt(args[0]) ;
int c2 = Integer.parseInt(args[1]) ;
int c3 = Integer.parseInt(args[2]) ;

if (c2 == c1 && c1 != c3 ) {
   ...
}
于 2010-10-31T08:30:10.610 回答
1

是的。你也可以写if ((c2-c1==0) && (c1 != c3))

于 2010-10-31T08:21:20.180 回答
1

如果你的意思是

if ((c1 != c3) && (c2-c1==0))

并且只有在“是”的情况下,您才打算做一些特别的事情c2-c1==0

于 2010-10-31T08:22:07.290 回答
1

如果没有涉及其他块,那么我建议您将其写为:

if (c2-c1==0 && c1 != c3 )

或者,如果你想交换它们,

if (c1 != c3 && c2-c1==0)
于 2010-10-31T08:23:58.700 回答