Есть ли причина для использования if(1//!Фу ())?


Я прочитал некоторые устаревшие коды:

if ( 1 || !Foo() )

есть ли видимая причина, почему не писать:

if ( !Foo() )
4 56

4 ответа:

два не то же самое. Первый никогда не будет оценивать Foo() потому что 1 короткое замыкание ||.

зачем это делается - наверное, кто-то хотел силой ворваться в then филиала для целей отладки и оставил его там. Также может быть, что это было написано до системы управления версиями, поэтому они не хотели, чтобы код был потерян, а просто обошел сейчас.

if (1 || !Foo() ) всегда будет доволен. !Foo() даже не будет достигнуто из-за оценка короткого замыкания.

это происходит, когда вы хотите, чтобы убедиться, что код ниже if будет выполнен, но вы не хотите, чтобы удалить реальные условие в нем, вероятно, для целей отладки.

дополнительная информация, которая может помочь вам:

  • if(a && b) - Если a и false,b не будет проверен.
  • if(a && b) - Если a и true,b будет проверяться, потому что если это false, то выражение будет false.
  • if(a || b) - если a и true,b не будет проверено, потому что это true в любом случае.
  • if(a || b) - если a и false,b будет проверено, потому что если b и true тогда это будет true.

настоятельно рекомендуется иметь макрос для этого цель, скажем DEBUG_ON 1, что позволит легче понять, что имеет в виду программист, а не иметь магия чисел в коде (спасибо @grigeshchauhan).

1 || condition

всегда верно, независимо от того,condition это правда или нет. В этом случае condition никогда даже не оценивается. Следующий код:

int c = 5;
if (1 || c++){}
printf("%d", c);

выходы 5 С c никогда не увеличивается, однако, если вы изменили 1 до 0 на c++ будет фактически вызван, делая вывод 6.


обычное практическое использование этого находится в ситуации, когда вы хотите проверить какой-то фрагмент кода, который находится вызывается, когда условие, которое оценивается как true только редко выполняется:

if (1 || condition ) {
    // code I want to test
}

таким образом condition никогда не будет оцениваться и поэтому // code I want to test всегда вызывается. Однако это определенно не то же, что:

if (condition) { ...

который является утверждением, где condition фактически будет оцениваться (и в вашем случае Foo будет называться)

на вопрос был дан правильный ответ-разница в том, что правая сторона операции or закорочена, предполагая, что это отладочный код для принудительного ввода в блок if.

но в интересах лучших практик, по крайней мере, мой грубый удар по лучшей практике, я бы предложил альтернативы, в порядке увеличения предпочтения (лучший-последний):

Примечание: заметил, что после того, как я закодировал примеры, это был вопрос C++, Примеры-C#. Надеюсь, вы можете перевести. Если кто-нибудь мне нужно, просто оставить комментарий.

встроенный комментарий:

if (1 /*condition*/) //temporary debug

Out-of-line комментарий:

//if(condition)
if(true) //temporary debug

Имя-Показательная Функция

//in some general-use container
bool ForceConditionForDebug(bool forcedResult, string IgnoredResult)
{
      #if DEBUG
          Debug.WriteLine(
              string.Format(
                  "Conditional {0} forced to {1} for debug purposes",
                  IgnoredResult,
                  forcedResult));
          return forcedResult;
      #else
          #if ALLOW_DEBUG_CODE_IN_RELEASE
              return forcedResult;
          #else
              throw new ApplicationException("Debug code detected in release mode");
          #endif
      #endif
}

//Where used
if(ForceConditionForDebug(true, "condition"))...

//Our case
if(ForceConditionForDebug(true, "!Foo()"))...

и если вы хотите действительно надежное решение, вы можете добавить правило репозитория в систему управления версиями, чтобы отклонить любой проверенный код, который называется ForceConditionForDebug. Этот код никогда не должен был быть написан таким образом, потому что он явно не передает намерения. Он никогда не должен был быть зарегистрирован (или были разрешены для регистрации) (управление версиями? экспертная оценка?) И это определенно никогда не должно быть разрешено выполнять в производстве в его нынешнем виде.