2011-12-19 79 views
0

这个问题已经缠着我了一会儿如果嵌套,检查指针是否有效,然后检查值

是它通常有一段代码是这样的:

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

,或者可以它与布尔完成? 我想前两个if可能在一行,但我不知道在不同的环境中他们被检查的顺序,我认为这可能会使它更难阅读。

+1

什么是上下文?首先,你可以用'if(ptr && ptr-> value == foo)'代替前两个ifs。但是权威的代码将取决于未显示的代码的其余部分。 – fge 2011-12-19 11:07:00

回答

0

所有的编译器应该遵循同样的precedence order,所以检查可以通过这种替换:

if (ptr && ptr->value == foo) 
{ 
    print("error"); 
    failed = true; 
} 

如果第一部分(孤ptr)为假,则表达式的其余部分将无法进行评估。这被称为短路。

+0

谢谢!并感谢我应该用google搜索的链接 – richy 2011-12-19 23:24:45

2

你总是可以依靠布尔运算符short-circuiting

const bool failed = (ptr != NULL) && (ptr->value == foo); 

如果第一(ptr != NULL)计算为false这不会评估第二部分。

2

你可以写你的情况是这样的:

if (ptr && ptr->value == foo) 
{ 
    print("error"); 
} 
else 
{ 
    print("all systems go"); 
} 

在C++中,条件懒洋洋地评估。一旦知道最终结果,评估就会停止。因此,对于OR,第一个真正的停止评估,为AND,第一个假结束评估

+0

它与条件没有任何关系。短路是布尔运算符的一个属性。 – 2011-12-19 11:09:47

+0

感谢您比我更精确;-) – crazyjul 2011-12-19 11:10:39

+0

不客气;) – 2011-12-19 11:11:55

1

在这种情况下,你当然可以这样做:

if (ptr && (ptr->value == foo)) 
{ 
    print("error"); 
} 
else 
{ 
    print("all systems go"); 
} 

这样保证了逻辑与和逻辑OR从左到右进行评估,当结果已知时评估将停止。所以这是安全的。

0

,你可以只写if(ptr && ptr->value == foo')

Ç保证,如果第一个条件会失败,第二个条件将无法在所有的检查。这是因为FALSE & ANYTHING == FALSE。

1

如果你不需要你以后failed布尔,该代码不完全一样的。

if (ptr && ptr->value == foo) { 
    print("error"); 
} else { 
    print("all systems go"); 
} 

的检查在if语句的顺序是明确定义和 - 运算符跳过第二比较ptr->value=foo如果第一个表达式是不正确的&&