![](/img/trans.png)
[英]Why the absence of curly brackets after FOR loop in finding factorials in C
[英]for loop brackets in c
我編寫了一個使用for循環打印整數值的程序,在打印之后,程序應該等待一秒鍾,然后用雙倍空格字符覆蓋那些整數,換句話說,程序的目的是在等待一秒后擦除那些整數。
這個程序:
#include <stdio.h>
#include <time.h>
int main (void) {
int i;
for(i=1;i<=5;i++){
printf("%d ",i);
}
for(;clock () < CLOCKS_PER_SEC;){} /*wait for one second*/
printf("\r"); /*move to the beginning of the line*/
for(i=1;i<=5;i++){
printf(" "); /*overwriting the integers*/
}
printf("\n");
return 0;
}
問題出在wait循環括號`for(; clock()<CLOCKS_PER_SEC;){}'當我刪除那些括號時程序正常工作。 但如果for循環帶括號。 程序不起作用,我的意思是程序仍然運行,但它會覆蓋整數,而不是首先顯示那些整數。
有人解釋一下發生了什么?
刪除括號時,printf(“\\ n”)語句將成為for循環的主體,邏輯上等效於:
for(;clock () < CLOCKS_PER_SEC;) {printf("\r");}
所以整數會立即被覆蓋而不是在延遲期結束之后。
當然,真正的問題是為什么你使用忙循環來進行延遲而不是僅僅調用sleep(1),這樣效率要高得多(即在延遲期間不會將CPU固定為100%)
你不是自己刷新stdout(printf寫入的流),所以直到'\\ r'被寫入才會發生,然后你立即清除它。
如果刪除{}
,則循環等效於
for(;clock () < CLOCKS_PER_SEC;)
printf("\r");
它寫了一堆\\r
,第一個刷新輸出,其余的都是冗余的。 循環完成后,清除該行,按照您的意願工作。
打印數字后應調用fflush(stdout)
。 或者你可以移動printf(“\\ r”),使它在等待循環之前出現(差異是光標結束的地方)。
你的循環是有問題的,因為不能保證clock()從0開始,並且它不會在許多系統上運行,你不應該像那樣旋轉......它會減慢你系統上運行的其他程序的速度。 你可以使用sleep(1),雖然它不是很准確。
我懷疑在兩種情況下輸出緩沖區的刷新方式不同。 您可以通過在有問題的循環之前使用fflush(stdout)
手動刷新緩沖區來檢查這一點。
另請注意,對於循環內的單行語句, {}
在C中不是必需的。
在第一個'for'循環中,您使用printf打印值。 這里'printf'使用'stdout',這是一個緩沖輸出 - 除非提供'\\ n'或緩沖區已滿,否則不會打印輸出。 所以你可以在第一個循環后使用flush(stdout)
或使用fprintf(stderr, "")
打印到不是緩沖輸出的標准錯誤。
以下是您可能需要的代碼:
#include <stdio.h>
int main(int argc, char * argv[]) {
int seconds = 10;
while(seconds>0) {
printf("%10d", --seconds);
fflush(stdout);
sleep(1);
printf("\r");
}
printf("%10s\n", "time up!");
return 0;
}
(既然你問fflush()是什么意思,這里有一點根據我的理解解釋)
這都是關於io緩存的 ,原因之一就是緩存:讀/寫內存可能比硬盤快1000倍。
所以程序應該嘗試減少讀/寫硬盤的頻率,而不是使用內存,但需要對用戶體驗和io延遲進行適當的權衡。
例如
fflush(FILE *文件) ,是stdio.h中的一個函數,它刷新指定FILE的緩存。 在您的情況下,該文件是stdout(標准輸出),它打印到您的控制台。 當您使用printf()打印單個數字時,它可能會寫入stdout的緩存,因此您沒有在控制台中看到它,但調用fflush(stdout)將緩存刷新到您的控制台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.