执行此代码时,不显示任何输出。这是为什么?

时间:2020-05-31 09:37:26

标签: c++ c loops for-loop

以下代码在执行时没有输出。谁能解释以下代码?

int main() {
  int i, j;

  for (i = 0; i < 10; i++) {
    if (i % 2)
      printf("%d\t", i);
    else
      break;
  }
}

3 个答案:

答案 0 :(得分:3)

0 % 2给出false,因此循环在第一次迭代时终止,而没有调用printf

答案 1 :(得分:2)

您的代码有两个问题:

1。

if (i % 2)

(i % 2)的条件为false,因为计算-0除以2-得出0-> 0 / 2 = 0。其余的也是0

2。

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.

Try this code online

请注意,由于隐式1 / 20.5的转换,除法1将结果double提升到最接近的上整数值int

答案 2 :(得分:-1)

i % 2i的欧几里得除法数除以2。这并不意味着“ i被2整除”。如果后者为true,则i % 2给出0,它隐式转换为false。如果为假,则i % 2给出1,它隐式转换为true。因此,在第一次迭代中,条件表达式的计算结果为false,因此您会立即退出循环。

如果要用2检查i的除数,则必须使用i % 2 == 0