2014-01-09 13 views
1

我遇到了這個for-loop,之前沒有遇到過,不知道這是可能的。 Personaly我會設置sum = 0之間的2 for循環,而不是它現在。用於在for循環中將值設置爲零的奇怪用法

怎麼可能sum不被設置爲0,每次student_index增加,是因爲當它初始化的編譯器只在第二for循環的第一個條件看一次,之後只增加student_index直到第二個條件滿足?

int main(int argc, char** argv) { 
    int test_index, student_index, scores[3][5] = { 
     {92, 73, 57, 98, 89}, 
     {88, 76, 23, 95, 72}, 
     {94, 82, 63, 99, 94} 
    }; 
    float sum; 

    for (test_index = 0; test_index < 3; test_index++) { 
     sum = 0; // This is where i would set `sum = 0` 
     for (student_index = 0, sum = 0; student_index < 5; student_index++) { 
      sum = sum + scores[test_index][student_index]; 
     } 
     cout << "Average score for test nr. " << test_index + 1 << ": " 
       << sum/5 << endl; 
    } 
    return 0; 
} 
+1

您的代碼中存在拼寫錯誤'som'與'sum'。請複製並粘貼*確切*代碼。 –

+0

這是糟糕的代碼 - 可能會讓讀者感到困惑,但正如其他人指出的那樣,它是有效的 - 不會混淆編譯器。 –

+0

並明確你在問什麼構造。就目前而言,「sum」在你說你期望它被設置的位置被設置爲零。所以你的困惑是令人困惑的。 –

回答

4

是不是因爲當它初始化,之後只有等到第二個條件滿足增加student_index編譯器只在第二for循環的第一個條件看一次?

是的。


for語法是:

for (init; condition; increment) 
在這種情況下

,所述init語句利用了comma operator

在C和C++編程語言中,逗號(表示由令牌)是一個二元運算符,它評估它的第一個操作數並丟棄結果,然後評估第二個操作數並返回該值(和ty PE)。

結果最終是這樣的:

init; 
while (condition) { 
    ... 
    increment; 
} 

在這種情況下的init有因爲逗號操作的多條指令。所以在循環體之前會發生多種事情,並且不會在循環內部重複。

+0

+1這就是我給了更多的時間寫的答案;-) – Roddy

+0

好的,謝謝你的偉大的答案(S)。不知何故,這種'sum'的位置使得代碼變得更乾淨,也許我會在將來像這樣開始使用它。 – WonderWorld

4

這是因爲如何for循環工作

for (<initial expression(s)>; <condition>; <iteration(s)>)

每個那些部分可以是完整的表達(其包括逗號分隔的表達式列表)。

+1

幾乎是這樣,除了它們是*表達式,* not *語句。*例如,您不能將'if'放入'for'標頭。 – Angew

+0

@Angew固定,謝謝。 – Roddy

+0

@Angew如果我們看看語法* for-init-statement *可以包含一個*表達式語句*,它肯定可以包含逗號操作符。它也可以包含一個*簡單聲明*,它不是一個表達式。所以最初的版本實際上更正確,它只是需要適當的細節,這個版本實際上是誤導性的。 –

1

兩者相當。 for語句的第一個(初始化)子句只在第一次迭代之前執行;因此student_indexsum都被設置爲零。在迭代之間,它執行第三個(迭代)子句,然後檢查第二個(條件)子句;這些都不會對sum做任何事情。

如果initialser是每次執行,那麼規範for聲明

for (i = 0; i < n; ++i) whatever; 

會永遠循環下去,重置i每次爲零,且結構將是完全無用的。

+0

假設它是初始值設定項,它將是將0設置爲0的正確位置。 – WonderWorld

1

如果我們看一下draft C++ standard部分6.5.3for語句我們可以看到這款for是如何描述如下:

的(換初始化語句條件選擇;表達選擇 )聲明

相當於

{ 
    for-init-statement 
    while (condition) { 
    statement 
    expression ; 
    } 
} 

我們可以從部分6.5,該換初始化語句允許包括表達式語句看到:

for-init-statement: 
    expression-statement 
    simple-declaration 

在這種情況下使用comma operator,來初始化student_indexsum

student_index = 0, sum = 0 
       ^