【C语言】从放弃到入门-笔记

计算机基本概述(理解)

计算机只能识别通电和断电两种状态,以数学的方式表示即是0和1
常见计算机语言有: 机器语言(0和1),汇编语言(),高级语言(贴近自然语言)

C语言介绍(理解)

windows,linux,ios等系统大部分代码是用c语言写的,现在的高级语言,C++,C#,Java,Go等主要语言也是由C演化而来的,所以学习C语言更快上手其它语言

开发工具安装(理解)

下载 轻量级开发工具 codeblocks-17.12mingw-setup.exe download
在这里插入图片描述

使用自带mingw编译器的版本。安装codeblocks后,就可以在里面写代码了。祝好运。

安装 ,默认选项,打开也是
环境变量,用户和系统变量的区别,设置用户变量只会对当前用户有效,而系统变量对所有用户有效。
把安装目录 C:\Program Files (x86)\CodeBlocks\MinGW\bin 添加到环境变量中的系统变量。
测试环境变量是否添加成功,打开一个新的cmd, 运行 gcc -v,能输出版本号即添加成功

创建第一个C语言项目

File-> New -> Project
选中Console application -> 勾上 Large icons -> Go
Next -> 选择C Next -> 填上项目名、项目位置 Next -> Next ->Finish
在这里插入图片描述

运行 在左侧边栏可以看到当前项目了,双击项目入口文件 main.c ,编写代码,点击工具栏中的绿色按钮 Build and run 编译代码
在这里插入图片描述

创建第一个C语言程序(掌握)
int main()
{
    return 0;
}
函数的定义和执行(掌握)

系统会自动调用 main 函数,作为入口函数,把代码写在main函数中或者 在main函数中就可以调用其它的函数

HelloWorld代码实现(掌握)

#include <stdlib.h> 告诉系统去哪找 printf(),在 main() 函数中调用 abc() 函数

#include <stdlib.h>
int main()
{
    printf("hello wolrd!\n");
    abc();
    return 0;
}
第一个C语言练习(理解)

使用两种方法输出一个桃心
方法一、每一个 printf() 输出一行 *

...

方法二、把所有 * 写在同一个printf() , 使用 \n 换行

int main()
{
printf("  *** ***\n ********* \n   *****\n    ***   \n     *   \n");
    return 0;
}
编写C语言程序注意点(掌握)

一、分号,每条完整的语句后面必须加分号结束 “;”
二、中文,只允许出现在注释中或双引号中
三、main 函数,必须有一个 main 函数

main函数的其它写法(理解)
注释基本概念(掌握)

一、单行注释,有效范围是一整行,从双斜杠到行的末尾
二、多行注释,有效范围不受行数限制, 从/ * 到 */ 之间,多行注释内可嵌套单行注释

// 单行注释
/* 多行注释 */
注释的注意点和应用场景(掌握)
C语言关键字(理解)

系统保留字,全部小写,一共32个关键字

C语言标识符(掌握)

标识符只能由字母数字下划线 [a-zA-Z0-9_] 组成,且不能以数字开头,不能是C语言的关键字,标识符在C语言中严格区别大小写。

标识符命名规范(理解)
C语言数据类型(理解)

静态数据是指永久性的数据,一般存储在硬盘中,在计算机重启后,数据仍然存在,只要不删除就会永久存在
动态数据是存在内存当中的,数据在重启计算机后就会消失

C语言常量(掌握)

常量,即生成后不可改变的数据。比如生活中的身份证号码、性别等就是一种常量

  1. 整型常量(整数 int) 1、2、3,
  2. 实型常量(小数 float double) ,实型常量又分成单精度常量 如3.14 、1.0,双精度常量 如10.5E、2.15f 等。
  3. 字符型常量( char),即放在单引号内的单个字符,如 ‘a’ 、‘1’ 、 ‘,’ 等,字符型常量有且只有1个字符,字符常量可以是转义字符,但不能是中文字符。
  4. 字符串常量(),放到双引号内的字符串
C语言变量定义(掌握)

定义变量的格式: 数据类型 变量名称; int number;

为什么要指定数据类型?
目的是告诉操作系统,这个变量用来存储什么类型的数据,让计算机对变量分配相应的存储空间。

常用数据类型有哪些?

数据类型注释
int整型
float实型 单精度浮点型,占4个字节,有效数为7位
double实型 双精度浮点型
占8字节,有效数为16位,最好定义符点数时,都采用double类型
char字符–一个字节
long长整型
short短整型

数据计量单位: 我们知道,计算机中存储的都是0和1 , 如果只有 1位 0,那么计量单位就是 bit,如果是 8位 00000000,计量单位就是 1byte(字节),如果是1024个 byte ,那么计量单位就是 1KB,如果有1024个 KB,那么计量单位就是 1M,假如有1024个 MB,那么计量单位就是 1GB

C语言变量使用(掌握)

申明变量格式: type variable; 或 type variable=value;

int num; // 申明变量
num = 100; //初始化
num = 101; //重新赋值
printf("%i\n",num); //输出变量值

变量的其它定义方式和初始化方式(掌握)

定义相同类型的多个变量可写在同一行,以逗号分隔。
定义变量时可以同时初始化,
定义变量可以完全初始化和部分初始化

int num2 , num3 ;
int num1 = 10, num5 = 101;
int num = 10, number ;
变量的作用域(掌握)

全局变量:是指定义在函数大括号外的,可以全局通常的变量
局部变量: 是指定义在函数大括号内 { type variable=value; } 的变量
作用域,即变量可以使用的有效范围,局部变量从定义变量开始 到 return 或者 右大括号 } 就结束了,全局变量从定义变量的开始位置到文件末尾结束。

局部变量在内存中的一个表现:

运行一个程序,首先,要把程序代码加载到内存当中,接下来程序会找到 main ,执行 main 函数之中的内容,当遇到一个左大括号 { ,程序会在内存中开辟一块内存空间用于存储内容,当程序遇到 赋值的变量后,会去查找这个变量是否申明过,如果找不到就说明没有内存空间明,也就无法存储这个变量值,继而导致程序出现错误 。
return 和 右大括号} 表示结束函数,也意味着内存空间的释放,在释放之后调用函数内的变量将不再有效

变量的注意点(掌握)

变量只能在作用域范围内使用,超出作用域后就不能使用
同一个作用域内,不能申明相同的局部变量名称,如果使用相同的变量,必须新开辟一块空间,如下:

int main(){
    int num=5;
    {
        int num =2;  //不同作用域则可以出现相同变量名
    }
    printf("%i",num);  // 输出 5
    return 0;
}

全局变量,可以出现相同的变量名称,但是同名变量不能都同时赋值。如 int n=1; int n=2;则出错

int number;
int number;
int main(){
    number =100;
    printf("%i",number);  // 输出100
    return 0;
}
printf函数输出不同类型数据(掌握)

printf 的格式
一、直接输出

printf("输出的内容");

二、格式化输出
格式: printf(“格式化字符串”,输出列表项),格式化字符串格式:%[标志] [输出宽度][.精度][长度]
输出整型数据 %i, %d
输出实型数据 : 单精度 %f , 双精度 %lf
输出字符型数据: %c

printf("%i\n",6);
printf("%d\n",7.7);
printf("%f\n",9.9f);
printf("%lf\n",10.10f);
printf("%c\n",'a');
printf函数宽度和标志(掌握)

格式化字符串格式:%[标志] [输出宽度][.精度][长度]
标志, + 输出加号,-左对齐,,0 右对齐," " 空格

int num = 99;
printf("%+i\n",num); //l标志+号,输出 +99,大于0才有加号,小于0即负数不会出现加号
printf("|%5i|\n",num); // %5,指定的数据至少输出5位,不够的用空格补齐,即 |   99|
printf("|%05i|\n",num); // %05,指定的数据至少输出5位,不够的用0补齐,输出 |00099|

printf函数精度和长度(掌握)

格式化字符串格式:%[标志] [输出宽度][.精度][长度]
精度即保留的小数位,单精度和双精度的有效位数是7和16,超出位数是无效数据

float num = 3.1415926;
printf("%.2f\n",num); // 3.14
printf("%.5f\n",num); // 3.14159
printf("%.*f\n",3,num); // 星号占位符,在后面告诉要保留的小数位数,输出 3.142
printf总结
格式化注释
%d按十进制整型数打印
%6d按十进制整整数打印,至少6个字符宽度
%f按照浮点数打印
%6f按照浮点数打印,至少6个字符宽度
%.2f按照浮点数打印,小数点后有两位小数
%6.2f按照浮点数打印,至少 6个字符宽,小数点后有两位小数
%o表八进制数
%x表十六进制数
%c表字符
%s表字符串
%%表百分号(%)本身
scanf函数基本使用(掌握)

scanf 用于接收键盘输入的内容,格式scanf(“格式化字符串”, 地址列表项); & 取地址符号

int num;
scanf("%i", &num);
printf("num = %i",num); // num = 9

double fv;
scanf("%lf",&fv);
printf("fv = %lf\n",fv); // 1.200000

scanf函数注意点(掌握)

scanf 会忽略与设定数据类型不同的字符,例如申明类型 int,输入123abc55,scanf只会接收最前面的123

int num , num2;
scanf("%i %i",&num2,&num);  // scanf 中有多个变量时,必须按设定的格式输入,示例中的是空格,那么就必须空格分隔 "55 66",是逗号就逗号分隔
printf("num2 = %i, num=%i\n", num2 , num);

scanf函数实现原理(掌握)

scanf 函数会从输入缓冲区获取数据,当数据不存在就会阻塞,等待输入。
用户输入数据,scanf会将输入数据存入缓冲区,然后再从缓冲区获取。
如果输入缓冲区已经有数据,那么就不再要求用户输入,而是直接从缓冲区获取。

设置2个 scanf,可以一次输完,2个数据之间加上空格 示例:“10 20”,scanf 会获取到这2个数据。原理是scanf 从输入缓冲区获取10,第2个scanf会先从缓冲区获取数据,会取到空格,但是空格不是 int 型不符合要求,于是再次获取到20,由于2个scanf都取到数据,程序就不会再阻塞而是直接运行下一行代码。

int num, num2;
scanf("%i", &num);
scanf("%i", &num2);
printf("num=%i num2=%i\n",num,num2);

清空输入缓冲区(掌握)

当需要用户输入新的数据时使用
清空: fflush(stdin);
在scanf() 后面调用,清空缓冲区的内容,但是这个函数不能跨平台只能在windows上使用
清空:setbuf(stdin,NULL)
在scanf() 后面调用,支持跨平台,推荐用这一种。

scanf("%i", &num);
fflush(stdin);
setbuf(stdin,NULL);
运算符基本概念(理解)

算术、关系、逻辑、位 运算符

算数运算符(掌握)

算数运算符: 加减乘除取余 + - * / %

int num;
num = 10 + 1 ;
printf("%i\n", num ); // 11
printf("%i\n", num / 5 ); // 2
printf("%i\n", num * 5 ); // 55
printf("%i\n", num % 5 ); // 1
算数运算注意点(掌握)

C语言加减乘除注意点: 在运算中,整数与整数运算,得到的结果一定是整数,整数与小数运算,得到的结果一定是小数

double result = 10 /3;
printf("%lf\n", result);  // 3.000000
printf("%lf\n", 10 /3.0); // 3.333333

取余注意点:在取余运算中只能计算整数,如果除数或者被除数有小数会出现语法错误

double result = 10 %3;
printf("%lf\n", result); // 1.000000
自动类型转换上(掌握)

在C语言中,不同的数据类型之间不能直接运算,必须先转换,转换分为 自动转 和强制转换
运算转换:表达式的数据类型不一样时,小类型(字节长度小的)的数据会自动转成大类型(字节长度大的)的数据,

double d = 3.0;
int i = 10;
printf("%lf\n", i / d); // 3.333333
自动类型转换下(掌握)

赋值转换,当等号两边数据类型不一样时,等号右边的数据自动转成等号左边的类型

double d = 4.0;
int i = d;
printf("%i\n", i);  // 4
强制类型转换(掌握)

在数据前加上括号类型 ,例如:(int) value

double d = 4.0;
int i = (int)d;
printf("%i\n", i);  // 4
赋值运算符(掌握)

加等于 减等于 乘等于 除等于 += 、-= 、*= 、/=

int num = 10;
num += 5;
printf("%i\n", num); // 15
printf("%i\n", num-=1); // 14
自增自减运算符基本使用(掌握)
自增自减写在变量前后的区别(掌握)

++n 本次运算加1, n++ 本次运算值不变,下次调用 n 时加1

int num = 10 , n = 10;
printf("%i\n", num++); // 10
printf("%i\n", num); //11
printf("%i\n", ++n); //11
自增自减注意点(掌握)

只用于变量,不用在常量和表达式上
用于表达式一:

int a = 10, b = 5;
(a + b )++ ;// error

而这样写,从表面上看等于3,但是结果并没有,不同编辑器运算结果不一样。 codeblocks 等于 6
用于表达式二:

int a = 1;
int x = ++a + ++a;
printf("%i\n", x);
sizeof运算符(掌握)

sizeof 用来计算一个变量或者常量所占内存的字节数, sizeof是一个运算符不是函数,参与运算,优先级高于算术运算符

int a = 100 , c;
printf("%i\n", sizeof(a));  // 4
double b = 1.0;
printf("%i\n", sizeof(b));  // 8
printf("%i\n", sizeof(char)); // 1
printf("%i\n", sizeof(float)); // 4

c = sizeof 10 + 10 ;
printf("%i\n", c);  // 14  , 字节数 4 + 10 等于 14
逗号运算符(掌握)

逗号也是一个运算符,
作用一:同时定义多个变量,同时初始化多个变量

int a, b ; 
 a=10 , b = 5; 

作用二,逗号运算符也有运算结果,逗号运算符取最后一次运算结果

int a = 100 , c;
c = ((1+1),(2+2),(3+3),1); 
printf("%i\n", c); // 1
printf( "%i\n", ((1+1),(2+2)) ); // 4
关系运算符(掌握)

结果成立返回 1 , 结果不成立返回 0 。在C语言中,0代表假,其它数值都代表真

printf("%i\n", 10 > 9);  // 1
printf("%i\n", 10 > 11);  // 0
关系运算符优先级和结合性(掌握)

关系运算符的结合性,
不能使用关系运算符来判断区间

printf("%i\n", 10 > 5 > 2 ); // 输出 0 而不是  1  ,因为 10 > 5 等于 1 , 1 > 2 等于 0 
逻辑运算符(掌握)

逻辑与 &&,一假则假 , 逻辑或 || 一真则真

printf("%i\n", (10 > 5 || 1 > 2 )); // 1
printf("%i\n", (10 > 5 && 1 > 2 )); // 0
逻辑运算符逻辑短路现象(掌握)

逻辑与遇假之后,后面的判断不再执行了,所以即使有 ++a,a的值仍然是初始值1
同样的逻辑或遇真之后,后面的判断也不再执行

int a = 1;
int num = (1 > 2) && (++num > 0);
printf("%i\n", num);   // 0
printf("%i\n", a);  // 1
三目运算符(掌握)

条件表达式 ? 结果A : 结果B
如果条件表达式的结果是真,返回A,如果条件表达式是假,返回B

int num = 1 > 2 ? "true" : "false";
printf(num); // false
运算符练习一(理解)

一、输入一个数,判断这个数是否在100~200之间?

printf("请输入一个整数:");
int num ;
scanf("%i",&num);
int res = num >= 100 && num <= 200;
res ? printf("是100~200之间的数") : printf("不是100~200之间的数");

二、表达式 6 == 6 == 6的值是多少?

int num ;
num = 6==6==6;
printf("%i",num); // 输出0 ,因为 6==6 结果是1 ,1==6,结果是0

三、用户从键盘上输入三个整数,请找出最大数?
思路:从一二中找最大的数,再用最大的比较第三个数,返回最大值

printf("请输入三个整数,用空格分隔:\n");
int num1, num2,num3;
scanf("%i %i %i",&num1,&num2,&num3);
int res = num1 > num2 ? num1 : num2;
int max= res > num3 ? res : num3 ;
printf("最大的数是 %i\n", max);
交换两个变量的值(掌握)

方式一、使用新变量空间 tmp 中转

int a=10, b=20;
printf("a=%i b=%i\n", a,b);  // 10 ,20
int tmp = a;    a = b;   b = tmp;
printf("a=%i b=%i\n", a,b);  //20 , 10

方式二、使用算术运算符

  int a=10, b=20;
   a = a + b;  //a = 10 + 20 ; a=30
   b = a - b;  // b = 30 - 20 ; b=10
   a = a - b;  // a = 30 - 10 ; a=20
   printf("a=%i b=%i\n", a,b); // 20 , 10
流程控制基本概念(理解)

数据结构,按顺序从上至下执行,选择结构,执行满足条件的代码

选择结构if第一种格式(掌握)

表达式:
if (条件表达式){
条件成立执行的语句;
}

选择结构if第二种格式(掌握)
    int a=99;
    if (a > 10 ){
        printf("a大于10");
    }else{
        printf("a小于10");
    }
选择结构if第三种格式(掌握)

表达式:
if(条件表达式){
条件成立执行;
}else if(条件2){
条件成立执行;
}else{
条件不成立执行;
}

   int a=90;
    if (a > 80 ){
        printf("优秀");
    }else if(a> 60){
        printf("及格");
    }else{
        printf("不及格");
    }
选择结构if注意点上(掌握)

if 可以省略 条件后面的大括号 {},但是只有紧随其后的第一条会受到控制

if (0)
    printf("1\n");
    printf("2\n");
    printf("3\n"); 输出 2,3 ,没有按条件设定那样完全不输出,第二条和第三顺序输出了
选择结构if注意点下(掌握)

比较运算,把常量放前面,避免少写了等号而没有发现

	//if(x=9) // 而变量在前,少写一个等号仍执行通过
    if (9=a){  //常量在前,少写了一个等号时,条件执行不通过,
    ...
    }    
选择结构if练习(理解)

一、从键盘输入一个整数,判断是否偶数?是的话输出YES,否则 NO

    int a;
    scanf("%i",&a);
    if(a %2 == 0) {
        printf("yes\n");
    }else{
        printf("no\n");
    }

二、接收用户输入的整数 1~7,判断星期几

    int d;
    scanf("%i",&d);
    if(d == 1) {
        printf("星期一\n");
    }else if(d == 2){
        printf("星期二\n");
    }else if(d == 3){
        printf("星期三\n");
    }
    ...

三、根据用户输入的月份,输出对应的季节
已知: 3/4/5春,6/7/8夏 910/11秋 12/1/2冬

    int d;
    scanf("%i",&d);
    if(d >=3 && d<=5) {
        printf("春\n");
    }else if(d >=6 && d<=8){
        printf("夏\n");
    }
    ...
选择结构if排序练习(掌握)

接收用户输入的三个整数,按升序输出?
思路:两两比较,前面的数大于后面的数,就交换两个数的位置

    int c,d,e,tmp;
    scanf("%i %i %i",&c,&d,&e);

    if(c > d){
        tmp = c; c =d; d = tmp;
    }
    if(c > e){
        tmp = c; c =e; e = tmp;
    }
    if(d > e){
        tmp = d; d =e; e = tmp;
    }
    printf("%i %i %i \n",c,d,e);
猜拳游戏上(理解)

用户输入一个0 ~ 2的数,系统随机生成一个0 ~ 2的数,判断用赢还是电脑赢 (0拳头,1布,2剪刀)
用时间生成一个随机数,再取余 3 ,得到 0 1 2 中的一个数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    int tmp;
    srand(time(NULL));
    tmp = rand() % 3;
    printf("%i\n",tmp);
return 0;
}
猜拳游戏中(理解)

方法一:三种情况全判断,用户赢的3种情况,0 vs 2,1 vs 0,2 vs 1 , 相等则平局,其它则用户输

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    int tmp,user;
    scanf("%i",&user);
	    if(user==0 ||user == 1 || user ==2){
	    srand(time(NULL));
	    tmp = rand() % 3;
	    printf("电脑: %i, 我:%i\n",tmp,user);

	    if(tmp==user){
	        printf("平局");
	    }else if((tmp==0 && user ==2) || (tmp==1 && user==0)  || (tmp==2 && user==1)){
	        printf("你输了");
	    }else{
	        printf("你赢了");
	    }
    }
return 0;
}
猜拳游戏下(理解)

方法二:用加减法,已知用户赢的情况 , 0-2 = -2, 1-0 = 1, 2-1=1;,用户出的数减电脑出的数,得到的值等于 -2或1 是用户赢了,等于-1或2是输了。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    printf("请输入一个0~2的整数(0拳头,1布,2剪刀):");
    int tmp,user,s;
    scanf("%i",&user);

    if(user==0 ||user == 1 || user ==2){
	    srand(time(NULL));
	    tmp = rand() % 3;
	    printf("我: %i, 电脑:%i\n",user,tmp);
	    s = user-tmp;
	    if( 0 == s ){
	        printf("打平了");
	    }else if(-2 == s|| 1 == s ){
	        printf("你赢了");
	    }else{
	        printf("你输了");
	    }
    }
return 0;
}
选择结构switch(掌握)

switch 结构

    printf("请输入1~7:");
    int d;
    scanf("%i",&d);
    switch(d){
case 1:
    printf("星期一\n");
    break;
case 2:
    printf("星期二\n");
    break;
default:
    printf("error ");
    break;
    }
选择结构switch注意点上(掌握)

break 是中断当前的 switch 语句,正常情况省略break会导致 case 和 default 失效,使选择执行变成顺序执行,如果多个值都执行同一个结果,则可以省略。default 可以写在任意位置,不一定要写最后

	int d = 3;
	switch(d){
	default:
	    break;
	case 3:
	case 4:
	case 5:
	    printf("春季\n");
	    break;
	}
选择结构switch注意点下(掌握)

1 . case 中的值不能重复、
2 . case 不能定义新变量、定义变量要用大括号扩起来 示例:case 1:{ int num; break;} case 2:
3 . switch(n) n可以是变量或常量,但不能是常量小数,错误示例: switch(3.14)
4 . case 后面也不能是小数,错误示例:case 3.14

选择结构switch练习一(理解)

0-100分的成绩,用switch 判断学生的考试成绩是 优秀、良好、及格、还是不及格
思路: 用分数 除以 10 ,由于C语言中整数除整数得到的也是整数,所以判断 0-10 就可以了

	int score=59;
	switch(score / 10){
	default:
	    printf("没有这个分数");
	    break;
	case 0:
    case 1:
    case 2:
	case 3:
	case 4:
	case 5:
	    printf("不及格\n");
	    break;
	case 6:
	    printf("及格\n");
	    break;
	    ...
	}
选择结构if和switch如何选择(掌握)

if 适合区间判断,switch 只适合固定值的判断。 if 适用范围更广

选择结构switch练习二(理解)

根据用户输入的公式计算加减乘除的值

    int a,b;
    char e;
    printf("请输入运算公式(例3+5):");
    scanf("%i %c %i", &a, &e , &b);

    printf("%i %c %i = ",a,e,b);
    switch(e){
    case '+' :
        printf("%i",a+b);
        break;
    case '-':
        printf("%i",a-b);
        break;
    case '*':
        printf("%i",a*b);
        break;
    case '/':
        printf("%i",a/b);
        break;
    default:
        printf("输入错误 ");
        break;
    }
循环结构while(掌握)

while 与 if 的格式差不多
while格式:
while (条件表达式){
只有条件为真才执行的代码;
}

循环结构while注意点(掌握)
循环结构while练习一(理解)

计算机 1+ 2 + n 的和

    int a,b = 1,c=0;
    scanf("%i", &a);
    while(b <= a){
        c =  c + b;
        b++;
    }
    printf("1 ~ %i 的和等于 %i\n", a, c);
循环结构while练习二(理解)

1~100 之间 有多少数是 7的倍数?

    int a=0;
    while(7 * a <= 100){
        a ++;
    }
    printf("1~100之间 7的倍数有 %i个\n",a-1);
循环结构dowhile(掌握)

do while 特点,一上来先执行一次,之后判断条件是否为真,条件为真循环,条件为假中断循环。
do while格式:
do{
} while(条件表达式);

    int a=0;
    do{
         a ++;
    }while(7 * a <= 100);
    printf("1~100之间 7的倍数有 %i个\n",a-1);
循环结构while和dowhile如何选择(掌握)
循环结构for(掌握)

for 循环格式:
for ( 初始化表达式; 条件表达式; 循环后增量表达式){
条件为真执行的代码;
}
用 for 计算0-100以内 7倍数有多少

    int a=0;
    for(int i=1; i * 7 <= 100; i++){
        a ++;
    }
    printf("7的倍数有 %i 个", a); // 14 个
循环结构while和for如何选择(掌握)
循环结构for注意点上(掌握)

在 for () 括号后面加分号,代表 for() 是单独的一块,{} 也是单独的一块,所以 for 仍然循环,但是没有代码可代执行,而{} 内的内容只会执行一次。

    int a=0,i=1;
    for(; i <= 10; i++);{
        a += i;
    }
    printf("1~10的和 %i", a);  //11 错误
循环结构for注意点下(掌握)

for 循环的局部变量作用域: 当代码执行遇到 {} ,就为 {} 开辟一块内存空间,当 {} 内的变量 a 没有申明,它会在外面寻找是否有定义 int a 。当变量 a 重新申明了,它就会在当前空间给 变量 a 一个存储空间,遇到 结束符号 } 就会关闭这个空间,所以在下面继续打印 a 没有拿到内部的 777 而是继续拿了外部空间的 666
一、重新申明变量

    int a=666;
    {
        int a = 777;
        printf("%i\n",a); /// 777
    }
    printf("%i\n",a); // 666

二、不申明变量,改变的是外部的 a 的值,所以关闭 {} 不影响外部 a 的值

    int a=666;
    {
        a = 777;
        printf("%i\n",a); /// 777
    }
    printf("%i\n",a); // 777

在 for 循环中, () 中可以定义 与 {} 同名的变量,因为 () 和 {} 的作用域不同,
原因: 代码遇到 for 后开辟一个存储空间,在 for 空间中会再为 () 和 {} 开辟两个空间。
() {} 定义 相同的变量名:

    for(int i=0;i<5;i++){
            int i=100;
        printf("%i\n",i); // 最近原则,5次输出结果是 100 
    }

{} 可以直接使用 () 定义的变量名

    for(int i=0;i<5;i++){
            i=100;
        printf("%i\n",i); // 调用了1次,输出结果是 100
    }

() 定义的变量可以在 {} 内使用,因为 调用 {} 时 ()内的空间没有关闭。
但 {} 内定义 的变量不能在 ()中使用,原因在执行完 {} 后,遇到 }, 大括号 {} 的空间就释放掉了,程序再次来到 () 调用 count, count 已经释放掉没有可调用的了,所以下面代码是错的
() 不可以使用 {} 内定义的变量

    for(int i=1; i<5; count++){ // error
            int count=1;
        printf("%i\n",i);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值