有什么理由使用if(1 ||!Foo())?
我读了一些遗留代码:
if ( 1 || !Foo() )
有没有看到为什么不写的原因:
if ( !Foo() )
这两个是不一样的。 第一个将永远不会评估Foo()
因为1
会使||
短路 。
为什么这样做 – 可能有人想强制进入then
分支进行debugging,并将其留在那里。 也可能是因为这是在源代码控制之前编写的,所以他们不希望代码丢失, 现在只是绕过了 。
if (1 || !Foo() )
总会被满足。 !Foo()
由于短路评估, !Foo()
甚至不会到达。
当你想要确保if
下面的代码被执行时,会发生这种情况,但是你不想删除它中的实际情况,可能是为了debugging目的。
其他信息可能会帮助您:
-
if(a && b)
– 如果a
是false
,b
将不被检查。 -
if(a && b)
– 如果a
是true
,b
将被检查,因为如果它是false
,则expression式将是false
。 -
if(a || b)
– 如果a
是true
,b
将不会被检查,因为无论如何这是true
。 -
if(a || b)
– 如果a
是false
,b
将被检查,因为如果b
是true
那么它将是true
。
强烈build议为此设置一个macros,例如DEBUG_ON 1
,这样可以更容易理解程序员的含义,而不是在代码中包含幻数 (Thanks @grigeshchauhan)。
1 || condition
无论condition
是否正确,总是如此。 在这种情况下, condition
永远不会被评估。 以下代码:
int c = 5; if (1 || c++){} printf("%d", c);
输出5
因为c
永远不会增加,但是如果你改变1
为0
, c++
将被实际调用,使输出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执行生产。