2013-07-14 78 views
0

下面的代碼運行沒有給出任何錯誤或警告for循環中允許多個條件嗎?

#include<stdio.h> 

int main(){ 
    int i, j; 
    int p = 0, q = 2; 
    for(i = 0, j = 0; i < p, j < q; i++, j++){ 
     printf("HelloWorld\n"); 
    } 
    return 0; 
} 

然而,該書Let Us C(Yashwant Kanetkar)說,只有一個表達式被允許在for循環測試表達式(見該書的第115)。

我不確定這個標準。在for循環的測試表達式中是否允許使用多個表達式?

編輯:我當然可以加入這兩個表達式,但當我在上面的代碼website上找到上述代碼時,我很沮喪。我的問題是,這是否有效的C代碼?

+1

是的,我當然可以,但當我在網站上發現上述代碼時,我很沮喪:http://www.geeksforgeeks.org/output-of-c-program-set-22/ –

+0

C標準是不同的,例如, C89和C99。除了C語言編譯器的不同實現之外,還有其他變體。你的代碼是正確的。 – Farshid

+0

該代碼是正確的 - 「逗號」運算符評估其操作數,其結果是最後一個操作數。例如'int a = 1,2; // here a = 2' –

回答

7

條件

i < p, j < q 

是允許的,但可能不是想要的結果,因爲它丟棄該表達式的結果,並返回的僅j < q結果。 comma operator評估逗號左側的表達式,丟棄它然後評估右側的表達式並將其返回。

如果你想測試多個條件。如果你想測試兩個條件,使用&&操作使用邏輯與操作&&代替

i < p && j < q 
+0

實際上根據你需要添加的關於''的操作符,'C中的操作符OP的約定來自於 –

+0

@GrijeshChauhan我的更新的答案是否更清晰? – simonc

+0

是的,我認爲足夠的,直到OP不會引起交叉問題或他對此的懷疑。 –

5

你可以用布爾它們關聯起來,並(& &)

for(i = 0, j = 0; (i < p) && (j < q); i++, j++){ 

以上,因爲(i < p)條件,因爲我& p均爲相同值立即失敗不會在環路打印出任何東西(0)。

更新:您的示例是有效的(但很愚蠢)C,因爲如果您啓動i = 30,您的循環仍將執行2次,因爲忽略逗號分隔列表中的第一個結果。

1
for(i = 0, j = 0; i < p && j < q; i++, j++){ 
+0

不,'我

3

代碼中發生的事情與逗號運算符,的工作方式有關。

i < pj < q都進行評估,但只有第二個表達式j < q的結果由for循環檢查。

1

即使我讀過Yashwant Kanetkar先生的那本書。它表示在for循環中只允許有一個條件,但是可以使用邏輯運算符連接for循環來在for循環中添加多個條件。在其他有我閱讀時間的書中,說只有一個條件是允許的。