2010-02-16 43 views
2

給定這個循環,爲什麼最後有一個分號?不理解這個語法

for(s = string; *s == ' '; s++) 
    ; 

感謝

編輯*那麼有沒有可能,因此開始於一個字符串,並檢查是否有空間的末端,降低直到它找到一個charachter扭轉這一程序?

+0

更改爲使用++ s - 它有可能生成更好的代碼。 – 2010-02-16 09:42:26

+4

爲什麼會使代碼更好?在這個例子中它將完全一樣。 – Marius 2010-02-16 09:44:12

+0

如果你有一個具有正確優化的編譯器(大部分都是這樣,因此「潛在」),情況就是這樣。除非需要後增量,否則使用預增量是一種很好的做法 - 優化通常不適用於非內置類型。 – 2010-02-16 09:53:37

回答

0

它導致循環無能爲力。所發生的只是指針是先進的。

3

分號表示循環內沒有任何內容。在你的代碼中,循環只是循環直到字符串中的字符不是空格。也就是說,在該行之後,s指向字符串中不是空格的第一個字符。

3

分號在循環中產生一個空語句。該循環搜索string中的第一個非空白char

6

它是一個空語句,這是一個無操作在C.這是因爲如果你曾說過:

for(s = string; *s == ' '; s++) 
{ 
    // do nothing 
} 

您可以使用此,當一切都可以在for(...)結構本身來完成 - 的C語法要求有一個受控制的陳述,但沒有什麼可做的。

+0

我不明白爲什麼這個問題在6年後沒有被接受爲答案 – 2016-10-13 15:44:53

0

必須有一個語句或塊作爲for循環的「主體」。這是循環中每次執行的內容(只要s仍指向一個空格)。

自身分號是聲明 - 也就是說,什麼也沒有發生在循環體,只是s++for環線。

1

因爲在C(和其他)的語法是: 爲(INIT;條件;步驟) 體

凡體可以是閉合的,但身體還可以(的代碼在{}塊)與...一起;

1

我想指出的是,循環可以這樣寫,使之更明確到底是怎麼回事,增加可讀性:

for(s = string; *s == ' ';) 
    s++; 

或使用while循環:

s = string; 
while(*s == ' ') 
    s++; 

但我認爲空體的第一種方法更多的是「c-idiomatic」(更難以閱讀)。

+0

可讀性的提高僅在您的眼中, 恕我直言。原始形式是慣用語的事實使得有經驗的C程序員可以輕鬆閱讀。 – 2010-02-16 09:59:04

+0

好吧,我們正在談論的*唯一的原因是因爲OP有理解它的問題...... – 2010-02-16 10:32:21