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