包含 scanf 和 printf 的声明的复合体

标签 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不先打印?

最佳答案

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 时循环退出。

关于包含 scanf 和 printf 的声明的复合体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13013557/

相关文章:

被调用的对象不是函数或函数指针

scala - 为什么将Scala for循环(和内部)NumericRange限制为Int大小,以及如何详细说明功能?

python - 将数字转换为具有固定长度的二进制

c - 如何在一段时间内重复一个过程直到按下回车?

c - GCC 中如何实现精确宽度的整数类型?

c - If 语句问题,不显示正确的输出

c - 将数组视为单个变量

java - 直方图是颠倒的

Java从对象/值的无序集合/列表中生成唯一的id

Bash for循环与命令的多行输出