嵌套if,检查指针是否有效然后检查值

时间:2011-12-19 11:04:50

标签: c pointers if-statement

这个问题一直困扰着我

通常有一段代码如下:

bool failed = false;
if (ptr)
{
    if (ptr->value == foo)
    {
        print("error");
        failed = true;
    }
}
if (!failed)
{
    print("all systems go");
}

或者可以用bool完成吗? 我猜前两个ifs可能在一行上,但我不确定在不同的环境中检查它们的顺序是什么,我认为这可能会让它更难阅读。

6 个答案:

答案 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)为假,则不会评估表达式的其余部分。这称为短路。