C++ 嵌套'if'语句中的所有代码都会运行,即使这会更改外部语句的布尔值?



我的C++代码中有几个if语句(一个嵌套在另一个中),我想确保它们能按预期运行-代码是:

if(state == entry){
    if(abs(distance < 0.05){
        state = arcing;
        ...
        startAngle = positionAC;
    }
    // Some more statements here...
}

如果满足第二个if语句条件,那么现在state的值已更改为arcing而不是entry,是否会运行我的注释"//此处还有更多语句…"所在的代码?我本以为应该运行它们,因为代码从第一个条件为true时起仍将执行,即使现在不再是了。这是正确的吗?

if检查

if(state == entry)

将在到达代码中的那一行时执行一次。

从那时起,state或entry的值是否被修改都无关紧要——如果到达该行时state等于entry,则if块内的整个代码都将被执行。

是。我记得有一次我对Pascal while循环有这样的怀疑。我们的课本没有用非常具体的术语描述循环的工作方式,只是它迭代了“而";情况确实如此。一些实验让我相信,每次迭代只检查一次条件,即在循环开始时。但问题是,我不应该检查这一点:这本书应该对此进行明确

所以,清晰度:

类似的C++if语句

if( condition )
{
    action_1;
    action_2;
    action_3;
}
something_more;

1相当于:

    const bool do_it = condition;    // The single evaluation of condition
    if( do_it ) goto do_actions;
    goto do_more_things;
do_actions:   // Just a name for this place in the code, a "label".
    action_1;
    action_2;
    action_3;          // The next executed statement is something_more.
do_more_things:
    something_more;

是的,两者都是有效的C++代码。

1)这种等价忽略了可能的名称冲突,并假设没有任何操作是声明。声明可以通过两种方式破坏对等性。首先,不允许goto跳过一个执行初始化的声明,该声明在跳转到的点的范围内。其次,当执行离开块时,将执行析构函数,要捕获它,必须假设这些析构函数执行也在操作中

如果If语句中的条件

if(state == entry){

将被求值为true(此时只求值一次),则将执行if的复合语句。

注释下的语句将只执行一次,除非第一个条件本身不在循环中,或者是递归调用的方法中。

但是,如果你想确保注释后的代码只有在状态==进入时才执行,你可以将代码更改为

如果((state==entry)&amp;(abs(距离<0.05)){

state = arcing;
...
startAngle = positionAC;

}

否则如果(状态==进入)

// Some more statements here...

}

最新更新