这个问题一直困扰着我
通常有一段代码如下:
bool failed = false;
if (ptr)
{
if (ptr->value == foo)
{
print("error");
failed = true;
}
}
if (!failed)
{
print("all systems go");
}
或者可以用bool完成吗? 我猜前两个ifs可能在一行上,但我不确定在不同的环境中检查它们的顺序是什么,我认为这可能会让它更难阅读。
答案 0 :(得分:2)
您始终可以依赖布尔运算符short-circuiting:
const bool failed = (ptr != NULL) && (ptr->value == foo);
如果第一部分(ptr != NULL
)评估为假,则不会评估第二部分。
答案 1 :(得分:2)
你可以写下这样的条件:
if (ptr && ptr->value == foo)
{
print("error");
}
else
{
print("all systems go");
}
在C ++中,条件被懒惰地评估。一旦知道最终结果,评估就会停止。因此对于OR,第一个true停止评估,对于AND,第一个false结束评估
答案 2 :(得分:1)
在这种情况下,你当然可以这样做:
if (ptr && (ptr->value == foo) )
{
print("error");
}
else
{
print("all systems go");
}
保证从左到右评估逻辑AND和逻辑OR,并且在知道结果时评估将停止。所以这是安全的。
答案 3 :(得分:1)
如果您稍后不需要failed
布尔值,则该代码完全相同。
if (ptr && ptr->value == foo) {
print("error");
} else {
print("all systems go");
}
if语句中的检查顺序是明确定义的,如果第一个表达式不为真,&&
- 运算符会跳过第二个比较ptr->value=foo
。
答案 4 :(得分:0)
你可以写if(ptr && ptr->value == foo')
C确保,如果第一个条件失败,则根本不会检查第二个条件。这是因为FALSE&任何==错误。
答案 5 :(得分:0)
所有编译器都应遵循相同的precedence order,因此检查可以替换为:
if (ptr && ptr->value == foo)
{
print("error");
failed = true;
}
如果第一部分(孤独ptr
)为假,则不会评估表达式的其余部分。这称为短路。