我差不多想在C中做1/2 + 2/3 + ... + 18/19 + 19/20,这是我的代码:
版本1:
int main(){
double i,j,sum;
for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++)
sum+=i/j;
printf("%f\n",sum);
return 0;
}
版本1输出: 16.402260
版本2:
int main(){
double i,j,sum;
for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++)
printf("%f\n",sum);
return 0;
}
版本2输出:
0.000000
0.500000
1.166667
1.916667
2.716667
3.550000
4.407143
5.282143
6.171032
7.071032
7.980123
8.896789
9.819866
10.748438
11.681771
12.619271
13.560447
14.504892
15.452260
第3版:
int main(){
double i,j,sum;
for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++)
;
printf("%f\n",sum);
return 0;
}
版本3输出:
16.402260
我很困惑为什么版本1&amp; 3版本2没有,因为版本2和版本3是非常相似的,除了版本3的for循环包含和空体,而版本2没有。
答案 0 :(得分:4)
你忘了括号。
for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++){
sum+=i/j;
printf("%f\n",sum);
}
在C / C ++中,你可以有一个两行for循环(或两行if语句),如下所示:
for()
line to execute
它被编译器解释为
for()
{
line to execute
}
但是,这个:
for()
line to execute
another line to execute
编译器会看到这样的:
for()
{
line to execute
}
another line to execute
答案 1 :(得分:4)
这是由于编译器如何转换for
循环:
for (i=1, j=2, sum=0; i <= 19 && j <= 20; i++, j++) { /* code */ }
即
for (/* init */; /* condition */; /* increment*/) { /* code */ }
...执行为......
i=1, j=2, sum = 0; /* init */
while (i <= 19 && j <= 20) { /* condition */
/* code */
i++, j++; /* increment */
}
因此,在版本2中,sum
中的printf
还没有最新值:
i=1, j=2, sum = 0; /* init */
while (i <= 19 && j <= 20) { /* condition */
/* code */
sum += i/j, i++, j++; /* increment */
}
...因为sum
是增量的一部分。
干杯!
答案 2 :(得分:2)
案例1:
for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++)
sum+=i/j;
printf("%f\n",sum);
被解释为
for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++)
sum+=i/j;
printf("%f\n",sum);
由编译器。 - printf只执行一次
案例3:
for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++)
;
printf("%f\n",sum);
printf在整个循环执行后执行。
如果你想在案例2中得到相同的结果:
for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++)
; /*let the loop complete, and then printf*/
printf("%f\n",sum);
答案 3 :(得分:2)
在版本2中,您打印输出n-1而不是n。
你需要在循环结束后打印'sum'。
int main() {
double i,j,sum;
for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++) printf("%f\n",sum);
printf("%f\n",sum);
return 0;
}
答案 4 :(得分:0)
代码
sum += i/j
正在最后一次printf之后执行。