JussKwh 发表于 2021-8-19 00:05:42

for 与 scanf 函数

//以下函数有很多没必要的问的,我会把要问的注释出来
//此程序为C Primer plus 141页,完全照着书打的

#include <stdio.h>
#define SIZE 10
#define PAR 72

int main(void)
{
        int index, score ;
        int sum = 0;
        float average;

        printf("Enter %d golf scores:\n", SIZE);
        for (index = 0; index < SIZE; index++)
                       
        //我就搞不懂这个for 和下面的 scanf 为什么连接起来了,又没有括号什么的,这样我就直接认为for这个单独语句产生了一个无意义的操作(指index +到10)然后跳到scanf函数,我都不知道该怎么理解了

                scanf("%d",&score);                                     
        printf("The scores read in are as follows:\n");
        for (index = 0; index < SIZE; index++)
                printf("%5d",&score);
        printf("\n");
        for (index = 0; index < SIZE; index++)
                sum += score;
        average =( float )sum / SIZE;
        printf("Sum of scores = %d , average = %.2f\n", sum, average);
        printf("That's a handicap of %.0f.\n",average - PAR );

        return 0;
}





//此为输出

Enter 10 golf scores:
99 95 109 105 100            //此处为scanf输入               
96 98 93 99 97 98               //此处为scanf输入

//就算连接起来了,这里为什么要输入11个数字才到下一步,当SIZE为9时判断结束循环就加1变成10了,下次判断10不小于10,应该输入10个就结束了

The scores read in are as follows:
99951091051009698939997
Sum of scores = 991, average = 99.10
That's a handicap of 27.

Max472 发表于 2021-8-19 07:42:03

for, while, if, else, ...
这些关键字引起的程序段如果后边不用{} 括起来,默认这些关键字下的第一行是这些关键字所管理的

大马强 发表于 2021-8-19 08:07:25

1.作用域或者说是工作区的问题,{}是用来限定作用域的,如果没有{} for, while, if, else 下一句纳入工作区
2.我在dev调试过,以空格做分隔符,输入10个数据后,它会一次次的调用scanf来进行赋值,你可以自己调试看看
3.0 ~ 10 会循环10次,所以你输入第11个的时候跳出

万千只cnm 发表于 2021-8-19 09:40:16

你没用花括号括起来
默认只循环一个语句呀

JussKwh 发表于 2021-8-19 11:53:18

本帖最后由 JussKwh 于 2021-8-19 12:05 编辑

JussKwh 发表于 2021-8-19 11:57:23

scanf后面不加括号,后面那个连一起我理解了。但是还有个问题书上写的for语句是,for(A;B;D){C}   先初始化一次(步骤A),然后判断(步骤B),然后执行(C),语句结束才执行(D)。   那么我这个语句就是在i等于9步骤(B)的时候scanf输入第十个数字(步骤C),结束后才i++到达10步骤(D),结束一个循环。   那么下个循环就是先判断10不小于10(B)直接跳出for循环,为什么在for循环里面的scanf还要输入第十一次(C),不是应该直接跳出到下一步吗

JussKwh 发表于 2021-8-19 11:58:08

本帖最后由 JussKwh 于 2021-8-19 12:39 编辑

还有书上有个例子就是
int n=0;

while (n++<3);
       printf("n is %d\n",n);
printf("That's all thid program does.\n");

return 0;

按楼上的说话,while和printf连接起来,不是应该每次打印n的值吗
为什么最后只输出了

n=4                                       //主要是这个,下面那个不用管
That's all thid program does.

JussKwh 发表于 2021-8-19 12:40:47

别说我抬杠,我只是想明白它到底是怎么个计算过程

隐市仙 发表于 2021-8-19 15:50:48

JussKwh 发表于 2021-8-19 11:58
还有书上有个例子就是
int n=0;



你while后面打了个分号,也就是n++符合条件就结束了,不会printf。然后一直到n++=4的时候,不小于3了,就输出了n=4,然后程序结束。至于你说的第一个for那个问题,那就是没打分号的结果,for执行条件,然后scanf视为for循环的一部分,当然会BUG。该打分号要打,不该打要不打。

JussKwh 发表于 2021-8-20 12:02:24

本帖最后由 JussKwh 于 2021-8-20 12:10 编辑

隐市仙 发表于 2021-8-19 15:50
你while后面打了个分号,也就是n++符合条件就结束了,不会printf。然后一直到n++=4的时候,不小于3了,就 ...

你自己去看看小甲鱼的视频他for后面有没有跟while一样的分号,n++为什么会加到4,i等于2的时候下一条语句就是3直接结束,怎么+到4的,小于3的条件为4这不就反了吗,for根本就没把printf放在循环里,当for语句结束直接执行printf,与上面第一个人说的while,for,if,什么接下来第一条语句不符合

wknb 发表于 2021-8-20 16:46:42

d

隐市仙 发表于 2021-8-21 11:59:19

JussKwh 发表于 2021-8-20 12:02
你自己去看看小甲鱼的视频他for后面有没有跟while一样的分号,n++为什么会加到4,i等于2的时候下一条语 ...

while(n++<3);
这里while后面跟了一个空语句
执行过程,n=0;
n=0,此时n++<3表达式的值为0<3,循环
n=1,此时n++<3表达式的值为1<3,循环
n=2,此时n++<3表达式的值为2<3,循环
n=3,此时n++<3表达式的值为3<3,跳出循环
注意++在后表达式的值为++之前的值,即n++表达式的值为n,之后n再加1
所以当n++<3时,是表达式的值小于3,之后n还要再加1,所以n=4

上述来源百度,简单来说就是n++和++n的区别,n++<3人类思维以为是加完小于3,然而实际是没加的时候小于3,然后+1结束。之后n++=3它不小于3了,还是会+1,然后跳出循环,于是就变4了。

lhgzbxhz 发表于 2021-8-24 10:43:02

JussKwh 发表于 2021-8-19 11:58
还有书上有个例子就是
int n=0;



while (n++<3);
就是while(...)与后面的;(啥都不干)连起来
就是while (n++<3)啥都不干
页: [1]
查看完整版本: for 与 scanf 函数