有什么理由使用if(1 ||!Foo())?

我读了一些遗留代码:

if ( 1 || !Foo() ) 

有没有看到为什么不写的原因:

 if ( !Foo() ) 

这两个是一样的。 第一个将永远不会评估Foo()因为1会使||短路 。

为什么这样做 – 可能有人想强制进入then分支进行debugging,并将其留在那里。 也可能是因为这是在源代码控制之前编写的,所以他们不希望代码丢失, 现在只是绕过

if (1 || !Foo() )总会被满足。 !Foo()由于短路评估, !Foo()甚至不会到达。

当你想要确保if下面的代码被执行时,会发生这种情况,但是你不想删除它中的实际情况,可能是为了debugging目的。

其他信息可能会帮助您:

  • if(a && b) – 如果afalseb将不被检查。
  • if(a && b) – 如果atrueb将被检查,因为如果它是false ,则expression式将是false
  • if(a || b) – 如果atrueb将不会被检查,因为无论如何这是true
  • if(a || b) – 如果afalseb将被检查,因为如果btrue那么它将是true

强烈build议为此设置一个macros,例如DEBUG_ON 1 ,这样可以更容易理解程序员的含义,而不是在代码中包含幻数 (Thanks @grigeshchauhan)。

 1 || condition 

无论condition是否正确,总是如此。 在这种情况下, condition永远不会被评估。 以下代码:

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

输出5因为c永远不会增加,但是如果你改变10c++将被实际调用,使输出6


这种情况通常的实际用法是当你想testing一些被调用的代码时,只有很less符合条件的情况才会被满足:

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

这种方式永远不会被评估,因此// code I want to test总是被调用。 不过这绝对不是一样的:

 if (condition) { ... 

这是一个condition将被实际评估的声明(在你的情况下, Foo将被调用)

这个问题得到了正确的回答 – 区别在于操作的右侧是短路的,提示这是强制进入if区块的debugging代码。

但是为了最佳实践的利益,至less我粗略地推荐了一个最佳实践,我会build议替代scheme,按照越来越偏好的顺序(最好是最后一个):

注意:注意到我编码的例子后,这是一个C + +的问题,例子是C#。 希望你能翻译。 如果有人需要我,只需发表评论。

在线评论:

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

线外评论:

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

名称 – 指示function

 //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()"))... 

如果你想要一个真正强大的解决scheme,你可以添加一个存储库规则来源控制,以拒绝任何名为ForceConditionForDebug的检入代码。 这个代码不应该是这样写的,因为它显然不能传达意图。 它永远不应该被检查(或被允许检查)(源代码pipe理?同行评审?)而且它绝对不能被允许以其当前forms执行生产。