【问题标题】:Decrementing Initialization of a For Loop (C) - EX: for(i--; i>0; i--)递减 For 循环的初始化 (C) - EX: for(i--; i>0; i--)
【发布时间】:2022-01-05 08:50:50
【问题描述】:

我一直在阅读“The Xinu Approach 2nd Ed.”一书中有关操作系统设计的内容,并在第 182/183 页的第 10 章中遇到了 for 循环语句。 for 循环开始递减 for 循环的初始化语句。我以前没有见过这个,所以我创建了我自己的这个循环版本来玩它,如下所示:

        #include stdio.h
        main(){
          int i = 100;
          for(i--; i>0; i--){
             printf("%d \r", i);
          }
        }

在使用 gcc 编译并运行这个小程序后,输出为: 1. 这让我很困惑,因为我预计 for 循环最终会跳过 i=99,因为减量运算符是在之后运行的观察初始化变量。

Xinu 中开始我提问的 for 循环代码与创建缓冲池有关,它本质上是循环通过一块内存(池)将其划分为单独的缓冲区。初始化变量 numbufs 代表用户希望从池中挖出的缓冲区数量。池的起始地址由 buf 给出。这是供参考的循环:

        for (numbufs-- ; numbufs>0 ; numbufs-- ) {
           bpptr = (struct bpentry *)buf;
           buf += bufsiz;
           bpptr->bpnext = (struct bpentry *)buf;
        }

有人能解释一下这些 for 循环是如何工作的吗?

【问题讨论】:

    标签: c for-loop operating-system


    【解决方案1】:

    在您的循环版本中,您打印 '\r' 字符。这是一个回车符。结果是 printf 覆盖了已经写入的字符。请看这个问题:What's the Use of '\r' escape sequence?

    【讨论】:

      【解决方案2】:

      所写的循环将从 99 倒数到 1,每次都叠印。由于您在循环中没有延迟,因此它将运行得比您看到的要快,并且您最终会在终端上看到1。在 printf 之后的循环中添加sleep(1);,您会更好地了解发生了什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 2018-01-11
        • 2011-06-14
        • 2011-07-27
        • 1970-01-01
        相关资源
        最近更新 更多