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?
答案 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--);
......像这样走过:
t
。scanf
,将结果(0)分配给i
,检查1(scanf
的结果)是否等于t
;它不是现在。printf
执行t
(打印4--
)printf
子句中提到for
,打印0\n
scanf
,将结果(1)分配给i
,检查1是否等于t
(现在是3,因为它已经减少)。printf
执行t
(打印3--
)printf
子句中提到for
,打印1\n
scanf
,将结果(2)分配给i
,检查1是否等于t
(现在是2,因为它已经减少)。printf
执行t
(打印2--
)。printf
子句中提到for
,打印2\n
scanf
,将结果(3)分配给i
,检查1是否等于t
(现在为1)。答案 2 :(得分:0)
'scanf'返回分配的项目数。对于您的输入,scanf为每个输入返回1(因为您希望一次读取一个项目'%d')。变量t以4开始。现在每次迭代的'for'条件变为:1-4,1-3,1-2和1-1(= 0),因此在'1-1'的情况下没有进入循环体(因为条件结果为0,表示为假)并终止循环。希望它能解释你的程序结果。