[英]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++);
現在, i
在printf
調用中得到了遞增,因此無需在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
循環的任何子句都可以為空:
break
或return
語句,或者通過直接或間接調用exit()
。 第一個for
循環是一個非常慣用的示例: for (i = 0; i < 25; i++) { ... }
這是另一個經典的for
循環: for (;;) { /* repeat some action for ever */ }
在發布的代碼中注意以下問題:
main
必須使用返回類型int
定義。 代碼使用過時的語法,其中返回類型隱式為int
。 此語法在C99中無效。 for
循環最多可將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.