我遇到了这个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;
}
答案 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_index
和sum
都设置为零。在迭代之间,它执行第三个(迭代)子句,然后检查第二个(条件)子句;这些都不会对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_index
和sum
:
student_index = 0, sum = 0
^