有问题的代码:
#include<iostream>
using namespace std;
int main() {
int a[10] = {0, 1, 0, 1, 0, 1, 1, 0, 0, 1};
for (int i = 0; i < 10; ++i) if (a[i] == 1) cout<<i<<" ";
cout<<endl;
for (int i = 0; i < 10 && a[i] == 1; ++i) cout<<i<<" ";
cout<<endl;
}
输出:
1 3 5 6 9
// and an empty line
如果我对条件评估的理解是正确的,则两个输出应相同。每次检查条件a[i] == 1
时,i
会增加。那么,为什么会这样呢?
我已经使用g ++和一个称为ideone link to code的在线想法对它进行了测试。
我相信我在这里缺少一些非常基本的东西,这是一个非常愚蠢的问题,所以请您原谅我。
答案 0 :(得分:1)
因为a [0] = 0,所以条件循环在i = 0中结束。您要继续的条件是[i] = 1。因此在第一种情况下会完成
答案 1 :(得分:1)
for
循环中的条件在每次迭代之前进行评估,如果结果为false
,则退出循环。
在第一种情况下,条件为i < 10
,只有在 false
达到10后,该条件才变为i
,因此if
中的条件被评估10次,您将得到输出1 3 5 6 9
。
在第二种情况下,条件为i < 10 && a[i] == 1
,当false
为0且i
为0时,它在第一次迭代时变为a[0]
。for
然后终止循环,并且永远不会评估if
语句中的条件,因此您不会获得任何输出。
答案 2 :(得分:0)
不。结果不一样。在第一个中, for 循环滚动到0到9,并且每次内部 if 检查 a 的对应索引是否等于1或没有。因此,第一个的性能很明显。第二个行为完全不同。第二个 for 只要条件成立就成立(因为 a [0] = 0 甚至在开始时都没有成立)。
一个更好的例子是:
int x[]={1, 1, 1, 0, 0, 0, 0, 0, 1, 1};
第一个循环输出0 1 2 8 9,第二个循环输出0 1 2。