簡體   English   中英

用於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延遲進行適當的權衡。

例如

  • 當按行讀取文件時,它可以一次讀取2kb左右而不是一行,然后可以從內存緩存中讀取,
  • 寫入控制台時,程序可能會選擇寫入內存緩存,直到遇到\\ n或\\ t char,以及其他一些情況。

fflush(FILE *文件) ,是stdio.h中的一個函數,它刷新指定FILE的緩存。 在您的情況下,該文件是stdout(標准輸出),它打印到您的控制台。 當您使用printf()打印單個數字時,它可能會寫入stdout的緩存,因此您沒有在控制台中看到它,但調用fflush(stdout)將緩存刷新到您的控制台。


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM