0

我几乎想在 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 和 3 可以工作而版本 2 不工作的原因感到困惑,因为版本 2 和版本 3 非常相似,除了版本 3 的 for 循环包含和空正文而版本 2 不包含这一事实。

4

5 回答 5

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
于 2013-05-17T18:20:57.680 回答
4

这是由于编译器转换for循环的方式:

 for (i=1, j=2, sum=0; i <= 19 && j <= 20; i++, j++) { /* code */ }

IE

 for (/* init */; /* condition */; /* increment*/) { /* code */ }

... 被执行为 ...

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

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

所以在第二版中,suminprintf还没有最新的值:

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

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

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

干杯!

于 2013-05-17T18:27:59.083 回答
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);
于 2013-05-17T18:22:07.230 回答
2

在版本 2 中,您正在打印输出和 n-1 而不是 n。

循环完成后,您需要打印“总和”。

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;
}
于 2013-05-17T18:25:33.000 回答
0

编码

    sum += i/j

在最后一个 printf 之后执行。

于 2013-05-17T18:21:52.270 回答