我的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)&;(abs(距离<0.05)){
state = arcing;
...
startAngle = positionAC;
}
否则如果(状态==进入)
{
// Some more statements here...
}