Is there any reason for using if(1 || !Foo())?
Is there any reason for using if(1 || !Foo())?
我读了一些遗留代码:
if ( 1 || !Foo() )
有什么明显的理由不写:
if ( !Foo() )
两者是不一样的。第一个永远不会评估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
下线评论:
//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-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- Is there any reason for using if(1 || !Foo())?
- 为什么C++编译器无法优化"if(test) --foo"以"foo -= test"?
- 静态无符号 int foo 和更高之后的 if ( foo >0 )?
- 使用 if(0 == foo()) 而不是 (foo() == 0) 有什么好处?