我无法弄清楚我做错了什么。我想打印非零元素,下面的代码打印无。
#include <stdio.h>
int main ()
{
int arr[4] = { 0, 3, 0, 7 };
// print non zero elements
for (int i = 0; i != 4 && arr[i] != 0; ++i)
printf("%d\t%d\n", i, arr[i]);
}
但是,如果我像下面那样移动阵列测试,它可以工作:
#include <stdio.h>
int main ()
{
int arr[4] = { 0, 3, 0, 7 };
// print non zero elements
for (int i = 0; i != 4; ++i) {
if (arr[i] != 0)
printf("%d\t%d\n", i, arr[i]);
}
}
怎么了?
答案 0 :(得分:6)
第一个循环与第二个循环不同的原因是第一个循环在i
到达数组中第一个零的位置时退出,而第二个循环总是一直向上第四个要素。
你的第一个循环等同于:
for (int i = 0; i != 4; ++i) {
if (arr[i] != 0)
printf("%d\t%d\n", i, arr[i]);
else
break;
}
突然看到零是第一个循环提前终止的原因。
答案 1 :(得分:2)
for (int i = 0; i != 4 && arr[i] != 0; ++i)
如果arr[i] == 0
,循环立即终止。 Ans作为已经的第一个元素 0
,它甚至不会运行一次。
答案 2 :(得分:2)
原因是你的第一个for循环等同于:
int i=0;
while(i!=4&&arr[i]!=0)
{
printf("%d\t%d\n", i, arr[i]);
++i;
}
这是在开始时检查的条件,因此你的循环在它开始第一次迭代之前终止。