For 循环的递减初始化 (C) - EX:for(i--; i>0; i--)
Decrementing Initialization of a For Loop (C) - EX: for(i--; i>0; i--)
我一直在阅读“The Xinu Approach 2nd Ed”一书中关于操作系统设计的内容,并在第 10 章第 182/183 页上遇到了一个 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 循环是如何工作的?
在您的循环版本中,您打印了“\r”字符。这是一个回车 return 字符。结果是 printf 覆盖了已经写入的字符。请看这个问题:What's the Use of '\r' escape sequence?
所写的循环将从99倒数到1,每次都套印。因为你在循环中没有延迟,它会比你看到的更快 运行,你最终会在终端上得到 1
。在 printf 之后的循环中添加一个 sleep(1);
,您会更好地了解发生了什么。
我一直在阅读“The Xinu Approach 2nd Ed”一书中关于操作系统设计的内容,并在第 10 章第 182/183 页上遇到了一个 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 循环是如何工作的?
在您的循环版本中,您打印了“\r”字符。这是一个回车 return 字符。结果是 printf 覆盖了已经写入的字符。请看这个问题:What's the Use of '\r' escape sequence?
所写的循环将从99倒数到1,每次都套印。因为你在循环中没有延迟,它会比你看到的更快 运行,你最终会在终端上得到 1
。在 printf 之后的循环中添加一个 sleep(1);
,您会更好地了解发生了什么。