计算机基本概述(理解)
计算机只能识别通电和断电两种状态,以数学的方式表示即是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语言常量(掌握)
常量,即生成后不可改变的数据。比如生活中的身份证号码、性别等就是一种常量
- 整型常量(整数 int) 1、2、3,
- 实型常量(小数 float double) ,实型常量又分成单精度常量 如3.14 、1.0,双精度常量 如10.5E、2.15f 等。
- 字符型常量( char),即放在单引号内的单个字符,如 ‘a’ 、‘1’ 、 ‘,’ 等,字符型常量有且只有1个字符,字符常量可以是转义字符,但不能是中文字符。
- 字符串常量(),放到双引号内的字符串
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);
}