您通常在之前设置默认值还是在else中设置默认值?

时间:2009-01-04 17:28:22

标签: optimization

你做了以下哪一项:

var = true;
if (...) var = false;

或者

if (...) var = false;
else var = true;

你有理由选择还是其他?

我的工作前提是var没有发生任何其他事情。下一行代码可能是:

if (var) { ... }

13 个答案:

答案 0 :(得分:9)

直接怎么样var = {...}因为它是布尔值?

答案 1 :(得分:5)

我更喜欢Java中的第二个,做这样的事情:

int x;
if (cond) {
  x = 1;
} else {
  x = 5;
}

因为如果稍后更改了某些内容(例如,我将else块转换为else if),编译器将告诉我该变量未能初始化,如果我未能初始化,我可能会错过我用了你的第一个策略。

答案 2 :(得分:3)

如果您的语言支持,您也可以使用三元运算符:)

如果IF有可能失败,我通常只会做第一个,如果有的话,变量必须有默认值。

答案 3 :(得分:2)

如果设置了默认值,那么稍后再将其重置为其他内容,虽然这是一个非常小的数量,但它仍然是浪费资源。所以,大多数情况下,对于大多数代码来说,平衡的if / else甚至是(?:)语法都更清晰,更合适,除了:

有时,如果你正在做的是构建直通代码(或决策函数),你从一个特定的条件开始,然后测试一大堆其他条件,看看是否有变化,那么你想要肯定首先设置默认值:

int final = 27;

if ( some condition ) final = 86;

if ( another condition ) {
    final = 98;
    return final;
}

if ( some state ) {
   final += 2;
}

return final;

或类似的东西。

顺便说一下:在你的例子中,如果设置'var',那么下一行只是测试'var',你真的不需要'var'吗?如果条件如此丑陋以至于使用'var'有助于使其可读,那么最好将条件移动到它自己的函数中,接受额外的函数调用来帮助提高可读性。一般而言,当且仅当您获得重要内容(例如可读性)时,您才会浪费资源。

保罗。

答案 4 :(得分:1)

取决于具体情况。当IF明显失败时,'var'需要为真,我会使用第二个选项。

答案 5 :(得分:1)

我使用第一种类型,除非要设置的值需要大量计算。

答案 6 :(得分:1)

总是第一个人说的第一个。然而,值得强调的原因是,这是因为它使程序更能抵御因不正确的维护而导致的未来错误。

例如,出现一些额外的业务条件并且维护编码人员在if中添加一些额外条件或者包含更多业务逻辑并错误地修改代码时,这是很常见的 - 例如

if (a==b) {
  if (a==c) {
    [new logic]
    var=false
  }
}
else {
  var = false
}

从表面上看,它看起来不太可能,但它经常发生惊人的事情(公平地说,经常出现这种情况后,原来如果情况复杂得多)。首先进行初始化可以防止这种情况发生。

答案 7 :(得分:0)

您更喜欢简短紧凑的代码,还是更容易阅读的代码?

如果您更喜欢使用简短紧凑的代码


var x = true;
if (...) x = false;

但这甚至可以“改善”。大多数语言都给出初始值,通常对于布尔类型,默认值为false。所以,你可以写


var x;
if (...) x = true;

如果您更喜欢易于阅读的代码


if (...) var x = false;
else var x = true;

因为它使你的意图清晰。

两者的表现相同。

答案 8 :(得分:0)

取决于语言。在C ++中,我强烈建议尽快将其设置为默认值,否则可能会产生垃圾结果。

在大多数其他语言中,您可以更灵活一些。事实上,我认为明确定义条件比设置默认值更具可读性。

答案 9 :(得分:0)

由于变量未写入以后,对于一般值,我将在Java中编写以下内容:

final Type var;
if (cond)
{
    var = value1;
}
else
{
     var = value2;
}

Java编译器将捕获var在使用之前未赋值的错误。 final关键字表示变量在条件之后是常量的事实。

在您使用布尔值的确切情况下,我会使用

final boolean var = !cond;

在这种情况下使用条件表示您受到“booleanophobia”的折磨。


在C中,我会在声明中初始化变量。

答案 10 :(得分:0)

我通常设置“默认”值并使用if语句来修改它。 如果不存在默认值,那么只有if语句。

int timeout = 100;
if (moreTime) timeout = 1000;

int searchOption = null;
if (sometest1) searchOption = 1;
if (sometest2) searchOption = 2;

// then later..
if (searchOption != null)
  .....

答案 11 :(得分:0)

如果初始化很复杂,直接表达式不能干净利落,我有时觉得处理这种情况很有用

boolean isFoo = determineWhetherFoo(...);

其中determineWhetherFoo采用任何必要的参数来进行确定并返回适当的布尔结果。这使得变量意味着什么以及它依赖什么非常清楚。将变量初始化为可能错误的值,然后是一堆可能改变其值的代码,有时会模糊表达的内容。

答案 12 :(得分:0)

无论你在哪里写if()也写下else - 即使它是空的 编译器会优化它,但它会强迫你(以及你之后的任何程序员)思考if()未被触发的时间,后果是什么?