我的C ++代码中有几个if
语句(一个嵌套在另一个中),我想确保它们会按照我的预期运行 - 代码是:
if(state == entry){
if(abs(distance < 0.05){
state = arcing;
...
startAngle = positionAC;
}
// Some more statements here...
}
如果满足第二个if
语句条件,那么我的评论所在的代码是&#34; //这里有更多的陈述......&#34;现在运行state
的值已更改为arcing
而不是entry
?我本以为应该运行它们,因为代码仍然会在第一个条件为真时执行,即使它现在不再存在。这是对的吗?
答案 0 :(得分:4)
if-check
if(state == entry)
在代码中到达该行的那一刻,将执行一次。
从那时起,状态或条目的值是否被修改无关紧要 - if-block中的整个代码将被执行,如果state在达到该行时状态等于条目。
答案 1 :(得分:1)
是。我记得曾经对Pascal while
循环有疑问。我们的教科书没有用非常具体的术语来描述循环的工作方式,而只是在“条件为真”的情况下迭代。一些实验使我确信每次迭代只检查一次条件,即在循环开始时。但问题是,我不应该检查一下:这本书应该是 clear 。
所以,清晰度:
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
- 跳过执行初始化的声明,并且跳转到的范围内。其次,析构会在执行离开块时执行,并且捕获那个析构函数必须想象那些析构函数执行是在这些操作之中。
答案 2 :(得分:0)
如果if语句中的条件
if(state == entry){
将被评估为true
(此时仅评估一次)然后将执行if的复合语句。
答案 3 :(得分:0)
注释下的语句将只执行一次,除非第一个条件本身不在循环中,或者是一个递归调用的方法。
但是如果你想确保注释后面的代码只在那个时候的state ==条目中执行,你可以改变你的代码,如下所示
if((state == entry)&amp;&amp;(abs(distance&lt; 0.05)){
state = arcing;
...
startAngle = positionAC;
}
否则if(state == entry)
{
// Some more statements here...
}