Назначенные инициализаторы iOS: использование NS_DESIGNATED_INITIALIZER

С операторами 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 ваш код будет функционально идентичным только в том случае, если следующие утверждения верны:

  1. Вы не изменяете значение из a в любой из ветвей if.
  2. == является отношением эквивалентности (в математическом смысле), и ни один из b1 через b11 не находится в одном классе эквивалентности .
  3. == не имеет побочных эффектов.

Чтобы уточнить дальнейшие abo ut point # 2 (а также точка # 3):

  • == всегда является отношением эквивалентности в C или Java и никогда не имеет побочных эффектов.
  • На языках, которые позвольте вам переопределить оператор ==, такой как C ++, Ruby или Scala, переопределенный оператор == не может быть отношением эквивалентности и может иметь побочные эффекты. Мы определенно надеемся, что тот, кто переопределяет оператор ==, был достаточно здравым, чтобы написать отношение эквивалентности, которое не имеет побочных эффектов, но нет никакой гарантии.
  • В JavaScript и некоторых других языках программирования со свободным типом преобразования правила, есть случаи, которые встроены в язык, где == не является транзитивным или несимметричным. (В Javascript === является отношением эквивалентности.)

С точки зрения производительности, пример # 1 гарантированно не выполняет никаких сравнений после совпадения. Возможно, компилятор сможет оптимизировать # 2, чтобы пропустить дополнительные сравнения, но это маловероятно. В следующем примере это, вероятно, не может, и если строки длинны, дополнительные сравнения не являются дешевыми.

if (strcmp(str, "b1") == 0) {
  ...
}
if (strcmp(str, "b2") == 0) {
  ...
}
if (strcmp(str, "b3") == 0) {
  ...
}
34
задан Mehul Parmar 3 October 2014 в 19:08
поделиться