以下代码在执行时没有输出。谁能解释以下代码?
int main() {
int i, j;
for (i = 0; i < 10; i++) {
if (i % 2)
printf("%d\t", i);
else
break;
}
}
答案 0 :(得分:3)
0 % 2
给出false
,因此循环在第一次迭代时终止,而没有调用printf
。
答案 1 :(得分:2)
您的代码有两个问题:
if (i % 2)
(i % 2)
的条件为false
,因为计算-0
除以2
-得出0
-> 0 / 2 = 0
。其余的也是0
。
else break;
如果(i % 2)
不是true
(这是0
在第一次迭代中的情况),则可以提供结果,您将立即退出for
循环。如果要证明从break;
到0
的所有值除以9
时是否都存在余数,通常可以省略2
语句。
请注意,将break;
打包在单独的else
语句中仍然是多余的。
旁注:
j
在您的代码中没有用。
我想您想要的是这样的东西:
#include <stdio.h>
int main (void) {
int i, j;
for ( i = 0; i < 10; i++ ) {
if ( ( j = i % 2 ) )
printf("(%d / 2) has a remainder of %d.\n", i, j);
else
printf("(%d / 2) has no remainder.\n", i);
}
}
输出:
(0 / 2) has no remainder.
(1 / 2) has a remainder of 1.
(2 / 2) has no remainder.
(3 / 2) has a remainder of 1.
(4 / 2) has no remainder.
(5 / 2) has a remainder of 1.
(6 / 2) has no remainder.
(7 / 2) has a remainder of 1.
(8 / 2) has no remainder.
(9 / 2) has a remainder of 1.
请注意,由于隐式1 / 2
到0.5
的转换,除法1
将结果double
提升到最接近的上整数值int
答案 2 :(得分:-1)
i % 2
将i
的欧几里得除法数除以2。这并不意味着“ i被2整除”。如果后者为true,则i % 2
给出0,它隐式转换为false
。如果为假,则i % 2
给出1,它隐式转换为true
。因此,在第一次迭代中,条件表达式的计算结果为false,因此您会立即退出循环。
如果要用2检查i
的除数,则必须使用i % 2 == 0
。