包含scanf和printf的声明的复杂

时间:2012-10-22 14:27:59

标签: c for-loop

int i;
main()
{
    int t;
    for ( t=4;scanf("%d",&i)-t;printf("%d\n",i))
        printf("%d--",t--);
}

如果输入为0,1,2,3,则输出为:

4--0 
3--1
2--2

请解释该程序的输出。我无法弄清楚为什么输出就是那样。循环如何在这个程序中工作?为什么不首先打印for循环中的printf?

3 个答案:

答案 0 :(得分:2)

for循环转换为等效的while循环。表单的for循环

for (initialize; condition; increment)
{
    body;
}

可以等效地写成:

initialize;
while (condition)
{
    body;
    increment;
}

注意increment语句如何在循环的底部结束。在循环体的之后执行,就在开始循环的下一次迭代之前。

所以你的循环就变成了这个:

int i;
main()
{
    int t;
    t = 4;
    while (scanf("%d",&i) - t)
    {
        printf("%d--", t--);
        printf("%d\n", i));
    }
}

这有帮助吗?

最棘手的部分是循环条件。当条件变为0时,循环将退出。scanf返回读入的项目数,对于每次读取的%d,此处将为1。如果scanf每次都返回1,则当t命中1时,循环退出。

答案 1 :(得分:0)

在循环体执行后调用for运算符的第三步。

说到你的例子,这......

for ( t=4;              // initialization statement
      scanf("%d",&i)-t; // check statement; if `false`, the loop is finished
      printf("%d\n",i)) // step statement, usually advances an iteration one step

  printf("%d--",t--);

......像这样走过:

  1. FOR初始化:将4分配给t
  2. FOR check:执行scanf,将结果(0)分配给i,检查1(scanf的结果)是否等于t;它不是现在。
  3. FOR循环:对{post} printf执行t(打印4--
  4. FOR step:在printf子句中提到for,打印0\n
  5. FOR check:执行scanf,将结果(1)分配给i,检查1是否等于t(现在是3,因为它已经减少)。
  6. FOR循环:对{post} printf执行t(打印3--
  7. FOR step:在printf子句中提到for,打印1\n
  8. FOR check:执行scanf,将结果(2)分配给i,检查1是否等于t(现在是2,因为它已经减少)。
  9. FOR循环:对{post} printf执行t(打印2--)。
  10. FOR step:在printf子句中提到for,打印2\n
  11. FOR check:执行scanf,将结果(3)分配给i,检查1是否等于t(现在为1)。
  12. FOR check failed =>循环结束。

答案 2 :(得分:0)

'scanf'返回分配的项目数。对于您的输入,scanf为每个输入返回1(因为您希望一次读取一个项目'%d')。变量t以4开始。现在每次迭代的'for'条件变为:1-4,1-3,1-2和1-1(= 0),因此在'1-1'的情况下没有进入循环体(因为条件结果为0,表示为假)并终止循环。希望它能解释你的程序结果。