我阅读了一些旧代码:
if ( 1 || !Foo() )
有没有任何明显的原因不写成这样:
if ( !Foo() )
我阅读了一些旧代码:
if ( 1 || !Foo() )
有没有任何明显的原因不写成这样:
if ( !Foo() )
这两者并不是一样的。第一个示例由于1
使得||
短路, 因此永远不会运行Foo()
函数。
为什么这么做呢?可能某人希望因调试目的而强制进入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)。
if(1 || !Foo()) {code}
,那么它的意思和 if(1){code}
或 {code}
是一样的。如果条件语句为 if(!Foo())
,则根据 Foo()
的返回值,结果可能是 {code}
或者仅仅是 ;
。 :) - Grijesh Chauhanif (DEGUG_ON || !Foo())
(实际上我会注释掉代码)。;) - Grijesh Chauhan1 || condition
condition
是否为真,true
都是成立的。在这种情况下,condition
甚至没有被求值。以下代码:int c = 5;
if (1 || c++){}
printf("%d", c);
由于未增加 c ,因此输出结果为5
。但是如果将1
更改为0
,则 c ++ 将被实际调用,使输出为6
。
通常的实际用途是在仅在很少满足计算结果为true的条件下才会调用的代码测试中使用:
if (1 || condition ) {
// code I want to test
}
条件
将永远不会被评估,因此//我想测试的代码
总是被调用。但这绝对不同于:if (condition) { ...
这是一种语句,其中condition
将会被评估(在你的情况下将调用Foo
)。
这个问题得到了适当的回答 - or操作符右侧被短路,表明这是一段调试代码,用于强制进入if块。但出于最佳实践的考虑(至少是我尝试的最佳实践),我建议提供以下替代方案,按推荐程度升序排列(最佳方案在最后):
注意:在编写示例后我注意到这是一个C++问题,示例是使用C#编写的。希望您可以进行翻译。如果有人需要,只需发布评论即可。
内联注释:
if (1 /*condition*/) //temporary debug
未在行内的评论:
//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的检入代码。该代码不应以这种方式编写,因为它显然不能传达意图。它永远不应该被检入(或允许被检入)(源代码控制?同行评审?),并且在当前形式下绝对不应该被允许在生产中执行。
if (1 || !foo())
相当于if (1)
。 - devnull1 || foo()
等同于foo()
。这意味着它们背后的代码是无用的。你可以将其与条件语句一起删除。 - Valreturn rand() % 2;
。 - Happy Green Kid Naps1 && !Foo()
等于!Foo()
。 - Niklas R