2013-05-17 41 views
0

我很想做1/2 + 2/3 + ... + 18/19 + 19/20℃,这里是我的代码:在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.98
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 & 3作品,其中包括版本2不,因为版本2和版本3非常相似,除了版本3的for循环包含空的主体以及版本2没有的主体。

回答

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 */ 
} 

所以在第二版,sumprintf没有最新值尚未:

i=1, j=2, sum = 0; /* init */ 
while (i <= 19 && j <= 20) { /* condition */ 
    /* code */ 

    sum += i/j, i++, j++; /* increment */ 
} 

...因为sum是增量的一部分。

干杯!

+0

噢好吧,明白了。谢谢Trinimon! = D顺便说一句,你的解释真棒! – Wobblester

4

你忘记了括号。

for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++){ 
    sum+=i/j; 
    printf("%f\n",sum); 
} 

在C/C++,你可以有循环的两行(或两行的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 
0

sum += i/j 

正在最后的printf后执行的代码。

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); 
+0

感谢您编辑我的问题和您的答案! = D – Wobblester

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; 
} 
+1

感谢您的帮助 – Wobblester

相关问题