在for循环中将值设置为零的奇数用法

时间:2014-01-09 20:32:00

标签: c++

我遇到了这个for-loop,这是我之前没遇到过的,不知道有可能。 Personaly我会在2个sum = 0循环之间设置for而不是现在的位置。

每次sum增加时,student_index怎么可能都不会被设置为0,是因为编译器只在第二个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;
}

4 个答案:

答案 0 :(得分:4)

  

是因为编译器在初始化时只在第二个for循环的第一个条件下查找一次,之后只增加student_index直到满足第二个条件?


for语法为:

for (init; condition; increment)

在这种情况下,init语句使用comma operator

  

在C和C ++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。

结果最终会像:

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

在这种情况下,由于逗号运算符,init有多个指令。因此,循环体之前会发生多处事情,并且不会在循环内部重复。

答案 1 :(得分:4)

这是因为for循环的工作原理

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

每个部分都可以是完整表达式(包括以逗号分隔的表达式列表)。

答案 2 :(得分:1)

两者都是等价的。 for语句的第一个(初始化)子句仅在第一次迭代之前执行;因此,student_indexsum都设置为零。在迭代之间,它执行第三个(迭代)子句,然后检查第二个(条件)子句;这些都不会对sum做任何事情。

如果每次执行初始化程序,则执行规范for语句

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

会永远循环,每次都将i重置为零,并且构造完全没用。

答案 3 :(得分:1)

如果我们查看draft C++ standard部分6.5.3 for语句,我们可以看到for如何描述如下:

  

for(for-init-statement condition opt ; expression opt )语句

     

相当于

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

我们可以从6.5部分看到 for-init-statement 允许包含表达式语句

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

在这种情况下使用comma operator来初始化student_indexsum

student_index = 0, sum = 0 
                 ^