2013-05-17 69 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

相關問題