Есть ли причина для использования if(1//!Фу ())?
Я прочитал некоторые устаревшие коды:
if ( 1 || !Foo() )
есть ли видимая причина, почему не писать:
if ( !Foo() )
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 debugOut-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. Этот код никогда не должен был быть написан таким образом, потому что он явно не передает намерения. Он никогда не должен был быть зарегистрирован (или были разрешены для регистрации) (управление версиями? экспертная оценка?) И это определенно никогда не должно быть разрешено выполнять в производстве в его нынешнем виде.