这两个计算三角数的程序有什么区别?

What is the difference between these two programs which compute triangular numbers?

这两个代码都可以编译,但只有第二个代码可以满足我的要求。 第一个代码:

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main()

  {
    int TriNumber = 0;
    int n;

       for(n = 5;  n <= 50; n += 5)
       TriNumber = ((n + 1) * n) / 2;

        printf("The trianglular number of %d is %d\n", n, TriNumber);

   }

输出:

The trianglular number of 55 is 1275

下面的程序做了我想要的:它为 5 到 50 之间的每五个整数打印一个三角形数。

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main()

{
   int TriNumber = 0;
   int n;

    for(n = 5;  n <= 50; n += 5)

        printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n) / 2));

}

这给出了我想要的输出:

The trianglular number of 5 is 15
The trianglular number of 10 is 55
The trianglular number of 15 is 120
The trianglular number of 20 is 210
The trianglular number of 25 is 325
The trianglular number of 30 is 465
The trianglular number of 35 is 630
The trianglular number of 40 is 820
The trianglular number of 45 is 1035
The trianglular number of 50 is 1275

我不明白为什么在第一个代码中将 TriNumber = ((n + 1) * n) / 2; 单独放在一行,而在第二个代码中将其放在 printf 函数中会有如此不同的结果。

没有花括号的 for 循环(或任何其他控制结构,就此而言)仅在一个语句上运行。所以第一个代码片段会循环 TriNumber 计算,但只在循环完成后调用 printf 。相当于写

for(n = 5;  n <= 50; n += 5) {
    TriNumber = ((n + 1) * n) / 2;
}
printf("The trianglular number of %d is %d\n", n, TriNumber);

为了让它按预期工作,您可以自己在两个语句周围添加花括号:

for(n = 5;  n <= 50; n += 5) {
    TriNumber = ((n + 1) * n) / 2;
    printf("The trianglular number of %d is %d\n", n, TriNumber);
}

在第一种情况下,您在最后一次循环迭代后打印,结果 n 获得额外增量 5,您会看到 55。在第二种情况下,您从上次迭代开始打印,并且循环计数器还没有额外增加,您会看到 50.

● 在你的第一种情况中,for循环计算TriNumber直到条件满足,然后移动到下一个语句;即 printf:

for(n = 5;  n <= 50; n += 5)
    TriNumber = ((n + 1) * n) / 2;

printf("The trianglular number of %d is %d\n", n, TriNumber);

这类似于(为了更好地理解):

for(n = 5;  n <= 50; n += 5)
{
    TriNumber = ((n + 1) * n) / 2;
}
printf("The triangular number of %d is %d\n", n, TriNumber);

这就是为什么您会得到一条声明输出:

The triangular number of 55 is 1275

● 在您的 第二种情况 中,for 循环计算 TriNumber 并在每次满足循环条件时打印它,因为这里的 printf 是要执行的 for 循环的下一个语句。

for(n = 5;  n <= 50; n += 5)

    printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n) / 2));

这与下面的代码类似,即使没有大括号 {}:

for(n = 5;  n <= 50; n += 5)
{
    printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n) / 2));
}

这不仅适用于 for 循环,而且适用于所有其他控制结构,如 whileif;等在没有 {} 的下一个语句上运行Mureinik.

所说的大括号