給定這個循環,爲什麼最後有一個分號?不理解這個語法
for(s = string; *s == ' '; s++)
;
感謝
編輯*那麼有沒有可能,因此開始於一個字符串,並檢查是否有空間的末端,降低直到它找到一個charachter扭轉這一程序?
給定這個循環,爲什麼最後有一個分號?不理解這個語法
for(s = string; *s == ' '; s++)
;
感謝
編輯*那麼有沒有可能,因此開始於一個字符串,並檢查是否有空間的末端,降低直到它找到一個charachter扭轉這一程序?
它導致循環無能爲力。所發生的只是指針是先進的。
分號表示循環內沒有任何內容。在你的代碼中,循環只是循環直到字符串中的字符不是空格。也就是說,在該行之後,s指向字符串中不是空格的第一個字符。
分號在循環中產生一個空語句。該循環搜索string
中的第一個非空白char
。
它是一個空語句,這是一個無操作在C.這是因爲如果你曾說過:
for(s = string; *s == ' '; s++)
{
// do nothing
}
您可以使用此,當一切都可以在for(...)
結構本身來完成 - 的C語法要求有一個受控制的陳述,但沒有什麼可做的。
我不明白爲什麼這個問題在6年後沒有被接受爲答案 – 2016-10-13 15:44:53
必須有一個語句或塊作爲for
循環的「主體」。這是循環中每次執行的內容(只要s
仍指向一個空格)。
自身分號是空聲明 - 也就是說,什麼也沒有發生在循環體,只是s++
在for
環線。
因爲在C(和其他)的語法是: 爲(INIT;條件;步驟) 體
凡體可以是閉合的,但身體還可以(的代碼在{}塊)與...一起;
我想指出的是,循環可以這樣寫,使之更明確到底是怎麼回事,增加可讀性:
for(s = string; *s == ' ';)
s++;
或使用while循環:
s = string;
while(*s == ' ')
s++;
但我認爲空體的第一種方法更多的是「c-idiomatic」(更難以閱讀)。
可讀性的提高僅在您的眼中, 恕我直言。原始形式是慣用語的事實使得有經驗的C程序員可以輕鬆閱讀。 – 2010-02-16 09:59:04
好吧,我們正在談論的*唯一的原因是因爲OP有理解它的問題...... – 2010-02-16 10:32:21
更改爲使用++ s - 它有可能生成更好的代碼。 – 2010-02-16 09:42:26
爲什麼會使代碼更好?在這個例子中它將完全一樣。 – Marius 2010-02-16 09:44:12
如果你有一個具有正確優化的編譯器(大部分都是這樣,因此「潛在」),情況就是這樣。除非需要後增量,否則使用預增量是一種很好的做法 - 優化通常不適用於非內置類型。 – 2010-02-16 09:53:37