return
в каждой ветви if
. В вашем коде у вас есть return
заявления в каждом из условий if. Когда у вас есть такая ситуация, есть два способа написать это. Во-первых, как вы написали его в примере 1:
if (a == b1) {
return c1;
} else if (a == b2) {
return c2;
} else {
return c11;
}
Другое следующее:
if (a == b1) {
return c1;
}
if (a == b2) {
return c2;
}
return c11; // no if or else around this return statement
Эти два способа написания кода идентичны.
Способ, которым вы написали код в примере 2, не будет компилироваться на C ++ или Java (и будет неопределенным поведением в C), поскольку компилятор не знает, что вы применили все возможные значения a
, поэтому он считает, что есть путь кода через функцию, которая может привести вас к концу функции, не возвращая возвращаемое значение.
if (a == b1) {
return c1;
}
if (a == b2) {
return c2;
}
...
if (a == b11) {
return c11;
}
// what if you set a to some value c12?
return
операторов в каждой ветви if
. Без операторов return
в каждой ветви if
ваш код будет функционально идентичным только в том случае, если следующие утверждения верны:
a
в любой из ветвей if
. ==
является отношением эквивалентности (в математическом смысле), и ни один из b1
через b11
не находится в одном классе эквивалентности . ==
не имеет побочных эффектов. Чтобы уточнить дальнейшие abo ut point # 2 (а также точка # 3):
==
всегда является отношением эквивалентности в C или Java и никогда не имеет побочных эффектов. ==
, такой как C ++, Ruby или Scala, переопределенный оператор ==
не может быть отношением эквивалентности и может иметь побочные эффекты. Мы определенно надеемся, что тот, кто переопределяет оператор ==
, был достаточно здравым, чтобы написать отношение эквивалентности, которое не имеет побочных эффектов, но нет никакой гарантии. ==
не является транзитивным или несимметричным. (В Javascript ===
является отношением эквивалентности.) С точки зрения производительности, пример # 1 гарантированно не выполняет никаких сравнений после совпадения. Возможно, компилятор сможет оптимизировать # 2, чтобы пропустить дополнительные сравнения, но это маловероятно. В следующем примере это, вероятно, не может, и если строки длинны, дополнительные сравнения не являются дешевыми.
if (strcmp(str, "b1") == 0) {
...
}
if (strcmp(str, "b2") == 0) {
...
}
if (strcmp(str, "b3") == 0) {
...
}