簡體   English   中英

有關C語言中循環語法的問題

[英]A question regarding the syntax of loop in C

我在練習本中看到了這個小問題,該練習本用於打印向后鍵入的內容。 在這里,我只是無法理解for (; i >= 0; i--)循環,為什么它不首先將i分配給變量,這也是一種正常的語法嗎? 謝謝!

#include <stdio.h>
#include <string.h>

main() {
    int i;
    char msg[25];
    printf("Type up to 25 characters and then press Enter...\n");
    for (i = 0; i < 25; i++) {
        msg[i] = getchar(); //Outputs a single character
        if (msg[i] == '\n') {
            i--;
            break;
        }
    }
    putchar('\n'); // One line break after the loop is done.
    for (; i >= 0; i--) {   // <--- this is the line
        putchar(msg[i]);
    }
    putchar('\n');
    return (0);
}

為什么不將i分配給第一個變量

因為i已經擁有我們想從先前的邏輯開始的價值。

這也是一種正常的語法嗎?

是。 任何的三個部分for介紹可能是空的。

for()循環中括號之間出現的三個表達式都是可選的,並且在理論上是任意的。

從理論上講,你可以寫

for(a = b; c < d; e++)
    printf("%d\n", f);

這可能毫無意義,也沒有用,但是就C語言而言,它沒有任何問題,而且我不希望編譯器發出任何錯誤消息甚至警告。

現在, 按照慣例 ,第一個表達式將初始化某些內容,第二個表達式測試是否應再次執行循環,第三個表達式遞增。 但這僅是約定,所有三個表達式都是可選的。

例如,你可以寫

int i = 5;
for(; i < 10; i++)
    printf("%d\n", i);

在這種情況下, i將在聲明時獲取其初始值。 可以肯定的是,這看起來很奇怪,而且可以說是不好的風格,但這不是違法的。

其他表達式也是可選的。 例如,我可以這樣寫:

int i = 5;
for(; i < 10; )
    printf("%d\n", i++);

現在, iprintf調用中得到了遞增,因此無需在for循環頭中對其for遞增。 但是到現在,我們基本上有了一個while循環:

int i = 5;
while(i < 10)
    printf("%d\n", i++);

無論如何,這解釋了您看到的循環。 從上面的代碼開始,變量i已經具有所需的值,因此沒有理由在for循環頭中設置它。

for循環的初始子句可以為空:在您提到的情況下, i已經包含了存儲在數組中的字符數,如果用戶在換行符之前鍵入的字符數較少,則為25個或更少。 但是該程序存在一個錯誤,因為i應該減少操作權限,以避免超出存儲在數組中的最后一個字符訪問msg 遞減i如果字符被鍵入'\\n'不一致和從輸出開始msg[i]是不正確了。

您的練習本過時且令人困惑。 考慮丟棄它,並使用最新的書籍或在線教程。

for循環的任何子句都可以為空:

  • 可能不需要初始子句
  • test子句可以為空,從而導致無限循環,該循環可以通過breakreturn語句,或者通過直接或間接調用exit()
  • update子句可以包含任何更新表達式,或者如果代碼已經更新了循環主體中的必需變量(如果根本需要任何更新),則該更新子句可以不包含任何更新表達式。

第一個for循環是一個非常慣用的示例: for (i = 0; i < 25; i++) { ... }

這是另一個經典的for循環: for (;;) { /* repeat some action for ever */ }

在發布的代碼中注意以下問題:

  • main必須使用返回類型int定義。 代碼使用過時的語法,其中返回類型隱式為int 此語法在C99中無效。
  • 如果用戶在換行符之前鍵入超過24個字符或在換行符之前發出文件結尾的信號,則第一個for循環最多可將25個字節存儲到數組中。
  • 該程序在后一種情況下具有未定義的行為,因為如果用戶在換行符之前鍵入25個字符,則msg[i]指向msg末尾。
  • 如果確實過早結束了輸入,則數組的內容將向后打印,並可能在開頭添加一些有趣的字符,例如ÿ
  • 無需包含<string.h>
  • 返回值(0)周圍的括號是沒有用的。

這是修改后的版本:

#include <stdio.h>

int main() {
    int i, c;
    char msg[25];
    printf("Type up to 25 characters and then press Enter...\n");
    for (i = 0; i < 25; i++) {
        c = getchar();
        if (c == EOF || c == '\n')
            break;
        msg[i] = c;
    }
    putchar('\n'); // One line break after the loop is done.
    while (--i >= 0) {   // equivalent to for (; --i >= 0;)
        putchar(msg[i]);
    }
    putchar('\n');
    return 0;
}

暫無
暫無

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

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