嵌套If(x)检查 - 更好的方法来写这个?

Wil*_*ill 7 c c++

在我用它们执行操作之前,有些地方检查有效指针; 这些检查有时可以很深入地嵌套.

例如,我有

if (a)
{
  if (a->b())
  {
    if (a->b()->c())
    {
      a->b()->c()->DoSomething();
    } 
  }
}
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢这个样子.有没有办法把它变成更具可读性的东西?理想的情况下,

if (a && a->b() && a->b()->c() )
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

会很棒,但显然不会奏效.

编辑 - nvm我提出的例子正如大家所指出的那样工作.我测试了它是否有效,但我的测试中的代码中有一个错误.咄!

Whi*_*ind 28

为什么后者不起作用?

在C中,&&是短路运算符,因此从左到右进行评估,如果任何评估为假,则评估停止.

事实上,你可以写:

a && a->b() && a->b()->c() && a->b()->c()->DoSomething();
Run Code Online (Sandbox Code Playgroud)

  • 是否可以写`a && a-> b()&& a-> b() - > c()&& a-> b() - > c() - > DoSomething();`取决于返回类型`DoSomething`.如果`DoSomething`返回无效,那就不合法了. (6认同)

Dan*_*llo 13

引自K&R 1:

表达由左&&||右连接或评估,并保证一旦知道真相或谎言,评估将立即停止.

因此,后者的例子将完美地运作,正如WhirlWind所指出的那样.


1 C编程语言,第二版,第21页.


Mar*_*ins 5

您的第二个示例适用于C/C++.当第一个FALSE值被击中时,它会短路.