这两个代码都可以编译,但只有第二个代码可以完成我想要的操作。第一个代码:
#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 %dn", n, TriNumber);
}
哪个输出:
55的三角形数是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 %dn", n, TriNumber = (((n + 1) * n) / 2));
}
这给出了我想要的输出:
三角形的5是15
10的三角形数是55
15的三角形数是120
20的三角形数是210
三角形的25是325
三角形的30是465
三角形的35是630
三角形的40是820
三角形的45是1035
三角形数字50是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 %dn", n, TriNumber);
为了让它像你预期的那样工作,你可以自己在这两个语句周围添加大括号:
for(n = 5; n <= 50; n += 5) {
TriNumber = ((n + 1) * n) / 2;
printf("The trianglular number of %d is %dn", n, TriNumber);
}
●在第一种情况中,for
循环计算TriNumber
,直到条件满足,然后转到下一个语句;即printf
:
for(n = 5; n <= 50; n += 5)
TriNumber = ((n + 1) * n) / 2;
printf("The trianglular number of %d is %dn", n, TriNumber);
这类似于(为了更好地理解):
for(n = 5; n <= 50; n += 5)
{
TriNumber = ((n + 1) * n) / 2;
}
printf("The triangular number of %d is %dn", n, TriNumber);
这就是为什么你会得到一个单一的语句输出:
三角形数字55是1275
●而在第二种情况中,for
循环计算TriNumber
,并在每次满足循环条件时打印它,因为这里的printf
是执行的for
循环的下一个语句。
for(n = 5; n <= 50; n += 5)
printf("The trianglular number of %d is %dn", n, TriNumber = (((n + 1) * n) / 2));
即使没有大括号CCD_ 13:,其也类似于以下代码
for(n = 5; n <= 50; n += 5)
{
printf("The trianglular number of %d is %dn", n, TriNumber = (((n + 1) * n) / 2));
}
这不仅适用于for
循环,而且适用于所有其他控制结构,如while
、if
;其在没有Mureinik所说的CCD_ 17大括号的情况下对下一个语句进行操作。
在第一种情况下,您在最后一次循环迭代后打印,结果n
获得5
的额外增量,您会看到55
。在第二种情况下,您从上一次迭代开始打印,循环计数器还没有额外增加,您会看到50
。