本帖最后由 xushengbin 于 2016-6-28 14:37 编辑
If you give someone a program , you will frustrate them for a day ; if you teach them how to program , you will frustrate them for a lifetime , but for you , maybe I just this person . 希望接下来的一段时间能够和大家一起探讨、学习 ! 附件是这个笔记gitbook样式 , 附带目录 , 下载后请双击index文件 .
在这里, 对于C语言中32个关键字作一个汇总 , 我这边主要分为5类 让大家对C语言关键字有一个宏观的了解 , 有助于对C语言的进一步学习 .
基本数据类型- int
- 整型
- 4个字节
- 取值范围 : -2^31 -- 2^31-1
- int 变量名 ;
- printf(); 打印变量的值占位符为 : %d
- 补充 :
- %02d 域宽为2位 , 不足2为用0补
复制代码- float
- 单精度浮点型
- 4个字节
- 取值范围 : -2^31 -- 2^31-1
- float 变量名 ;
- 赋值注意 : 3.14f , 1.1f 别忘了后面的f , 不然编译器就认为你这个是double类型了
- printf(); 打印变量的值占位符为 : %f
- 补充 :
- %.2f 保留小数点后2位
复制代码- double
- 双精度浮点型
- 8个字节
- 取值范围 : -2^63 -- 2^63-1
- double 变量名 ;
- printf(); 打印变量的值占位符为 : %lf
- 补充 :
- %.2lf 保留小数点后2位
复制代码- char
- 字符型
- 1个字节
- 取值范围 : -2^7 -- 2^7-1
- char 变量名 ;
- printf(); 打印变量的值占位符为 : %c
复制代码 以上统称基本数据类型
- 对于基本数据类型的定义与赋值分2种 :
- 1. 先定义 , 后初始化
- int num;
- num = 30;
- 2. 定义的同时初始化
- int num = 30;
- 补充 : 键盘接收赋值
- int num;
- printf("请输入一个整型数 : ");
- scanf("%d",&num);
复制代码
构造类型
- struct
- 构造类型 / 结构体
- 存储空间 : 所有元素占用空间之和(考虑对齐)
- 逐个元素对齐(下个元素与之前所有元素之和对齐)
- 整体对齐(最后的和能单独整除所有元素)--> 最后能整除最长类型
区分结构体类型 , 结构体变量 , 结构体别名 结构体类型
- //结构体类型 : 这个仅仅只是定义的类型
- struct Car{
- int lunzi; //轮子
- char *pp; //品牌
- };
复制代码 结构体变量
- //结构体类型 : 这个仅仅只是定义的类型
- struct Car{
- int lunzi; //轮子
- char *pp; //品牌
- }car;
- 变量名为 : car
复制代码 结构体类型起别名
- typedef struct Car{
- int lunzi; //轮子
- char *pp; //品牌
- }iCar;
- 对结构体类型 :struct Car 起了别名: iCar
复制代码- union (用得少 , 知道是个关键字 , 知道是个类型名称就可以)
- 构造类型 / 共用体
- 解释 : 里面的元素类型公用一块内存区域
- enum
- 构造类型 / 枚举
- 引出 : 在实际问题中 , 有些变量的取值被限定在一个有限的范围内 , 例如 : 一个星期只有7天 , 一年只有12个月等等 , 如果把这些量说明为整型 , 字符型等是不太妥当的 , 因为一周不能被赋值为8天 , 枚举类型 , 就是列举所有可能的取值 .
- 一般形式 : enum 枚举类型名 {枚举值列表} ;
区分枚举类型 , 枚举变量 , 枚举别名 枚举类型
- //枚举类型 : 这个仅仅只是定义的类型
- enum Sex{kSexMan,kSexWomen,kSexYao};
复制代码 枚举变量
- //枚举变量 : 这个定义了类型 , 还定义了变量
- enum Sex{kSexMan,kSexWomen,kSexYao} sex;
- 变量名为 : sex
复制代码 枚举类型起别名
- typedef enum Sex{kSexMan,kSexWomen,kSexYao} iSex ;
- 对结构体类型 :enum Sex 起了别名: iSex
复制代码 特殊的定义类型- //-------------------typedef定义类型
- 定义:给已经存在的数据类型取一个别名
- 格式:typedef 原类型 新类型名; //新类型名尽量要大写
- 1、基本数据类型
- typedef int MALATANG; 别名: MALATANG
- 3、给结构体其别名
- typedef struct Person P; 别名: P
- typedef struct { int screenSize; int ram;} IPHONE; 别名: IPHONE
- 4、给枚举类型起别名
- typedef enum Sex{kSexMan,kSexWomen,kSexYao} iSex; 别名: iSex
- //以下了解:-----------------------------------
- 2、用在数组,给数组起别名
- typedef int ARRAY[5]; 别名: ARRAY
- 3 函数指针 , 给函数指针起别名
- typedef void (*FUN)(); 这个是一个无参无返回值函数指针变量的别名 , 别名 : FUN (注意我的描述)
复制代码
空类型空类型引出函数用于返回值类型 , 返回值类型为void , 表示无返回值 , 无返回值意味值被调函数不需要返回数据给主调函数
return关键字就是用于 被调函数返回数据给主调函数
顺序结构结构体化程序是一个设计思想,规定了一套方法,使程序具有合理的结构,以保证和验证程序的正确性. 这种方法要求程序设计者不能随心所欲地编写程序,而要按照一定的结构形式来设计和编写程序. 它的一个重要目的是使程序具有良好的结构,使程序易于设计,易于 理解,易于调试修改,以提高设计和维护程序工作的效率. - 顺序结构
- 分支结构 if / if..else.. / if..else if.. / if..else if..else..
- 循环结构
IF语句- 注意点: 分号是语句的结束,在C语言中只要是语句,都一定会有分号
- //----------if语句-----------//
- ## 一般形式(第一种形式):表示如果表达式为真,执行语句块1,否则不执行。
- //一: if
- if(判断表达式)
- {
- 语句块1;
- }
- .......
- 后续语句;
- //二: if...else
- if ...else ...语句使用
- ## 如果表达式为真,则执行语句块1,否则执行语句块2
- if(表达式)
- {
- 语句块1;
- }else{
- 语句块2;
- }
- //三: else if
- ## 如果表达式1为真,则执行语句块1,否则判断表达式2,如果为真执行语句块2,否则再判断 表达式3,如果真执行语句块3, 当表达式1、2、3都不满足,会执行最后一个else语句。
- if(表达式1)
- {
- 语句块1;
- }else if(表达式2){
- 语句块2;
- }else if(表达式3){
- 语句块3;
- }else{
- 语句块4;
- }
- 了解+理解:
- //四.if(表达式) 省略括号 if的作用范围一直到;结束
- ## 开发坚决不要省略括号
- if(表达式)
- 语句1;
- 语句2;
- -----
- |
- |
- V
- if(表达式){
- 语句1;
- }
- 语句2;
- 试做一题:
- int a=1;
- if (a>1) {
- printf("a>1\n");
- }else if(a++){
- printf("a>2\n");
- }else if(a>3){
- printf("a>3\n");
- 打印哪几句 ? 还是其中一句 ?
- //-------------------if值得注意的地方
- 注意点:
- 1.分支语句只会执行其中一个分支
- 2.省略括号只对下一条语句有效
- if(表达式)
- 语句1;
- 语句2;
- if(表达式){
- 语句1;
- }
- 语句2;
- 3.分支语句可以嵌套
- if(表达式1){
- if(表达式2){
- }
- }else{
- }
- 4.省略括号后下一句不允许定义变量 //记忆
- if(表达式)
- int a = 0;
- printf("xxx");
- // 可以这么写也可以不这么写,关键你要知道 = (赋值),与 ==(关系运算)的区别
- 5.==判断的时候建议常量写在前面
- int a = 0;
- if(0 == a){ //判断
- ......
- }
- -----------
- if(a = 0){ //赋值 把0赋值给a,最后以a的值作为表达式的值
- ....
- }
- //------------
- if(a==0){ //判断 看a是否等于0
- printf("a");
- }
- printf("b");
复制代码 switch语句- //---------switch分支语句-----------//
- 1)使用格式
- switch(表达式){ //switch 表达式 必须是 整型常量,整型变量或者整型表达式,或者字符变量,字符常量
- case 常量1: 语句1; //case 常量表达式 必须是整型 常量 'a'
- case 常量表达式2: 语句2; ...
- case 常量表达式n: 语句n;
- default: 语句n+1;
- }
- 其语义是:
- 计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如 表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
复制代码- //---------switch分支值得注意的地方---------//
- 1) 表达式的类型(case语句后的值)必须是整型或可以转变为整型的值 (short、char和int类型)。
- 整型变量 整形常量 返回值是整形的表达式 可以装换为int类型的表达式
- 2) 功能代码部分可以写任意多句。
- 3) case语句可以有任意多句,可以不用加括号“{}”
- 4) break关键字的意思是中断,指结束switch语句,break语句为可选。
复制代码- 1)case的值1、值2...值n只能为整型常量(整数),不能为变量。
- 2)case后面不可以直接定义变量
- 如果在case后面定义的变量必须加上大括号
- 执行流程:在执行的过程中,如果遇到break语句,则跳出switch语句。如果没有遇到break 语句,则一直执行到switch语句的结束。
复制代码
case- //---------case语句的穿透问题-----------//
- case语句执行的过程中,一旦进入某个分支后就会一直执行到switch结束。
- 为了避免上述情况,使用break语句,可以跳出switch语句.
复制代码
default- 所有case条件不匹配 , 最后就执行deault中的语句
复制代码 break循环结构引出循环 :
- //---------循环结构-----------//
- 循环结构是程序中一种很重要的结构。
- 其特点是,在给定条件成立时,反复执行某程序段, 直到条件不成立为止。给定的条件称为循环条件,
- 反复执行的程序段称为循环体。
- 循环结构简单来说就是:循环是一次又一次的执行相同的代码块
- // 7次 格式
- while语句;
- do-while语句;
- for语句;
- 一般来说 一个循环需要以下几部分构成:
- 1)循环控制条件 循环退出的主要依据,来控制循环到底什么时候退出
- 2)循环体 循环的过程中重复执行的代码段
- 3)能够让循环结束的语句(递增、递减、真、假等) 能够让循环条件为假的依据,否则退出循环
复制代码 while语句- //---------while循环-----------//
- while ( 条件表达式 )
- {
- 语句1;
- 语句2;
- ....(让条件表达式为假/有一句可以让循环结束)
- }
- 1)while循环的特点:
- 如果while中的条件一开始就不成立,那么循环体中的语句永远不会被执行
- 2)while语句的语义是:
- 如果条件成立,就会执行循环体中的语句“循环体”。然后再次判断条件,重复上述过程,直到条件不成立就结束while循环
复制代码 dowhile语句- //---------do-while-----------//
- while(条件){
- 语句块;
- }
- 当型循环:当条件满足的时候,再去执行循环体
- do {
- 语句1;
- 语句2; ....
- } while ( 条件 );
- 直到型循环:先执行循环体,然后判断条件,直到条件为假就结束
- 1)do...while语句的语义
- 2)do-while循环的特点:
- 不管while中的条件是否成立,循环体中的语句至少会被执行一遍
- 对比:
- while 是先判断再执行 30%
- do-while 是先执行再判断 5%
- 当循环条件第一次判断不为假的时候,while和do-while执行的次数相同,为假,do-while会执行一次
复制代码- //---------while的死循环-----------//
- 死循环:就是一直都执行循环体中的代码,不会退出
- while(条件);
- 1)不知道要循环的次数的时候使用最佳 常常妙用死循环
- 2)在某个范围內查找满足条件的值
- 终端终止操作: control+c
复制代码 for语句- //---------for循环-----------//
- 一般形式:
- for( 表达式1 ; 表达式2 ; 表达式3 ) {
- 语句;
- }
- for循环执行过程
- (1) 先求解表达式1。
- (2) 求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下 面 第(3)步。若为假(值为0),则结束循环,转到第(5)步。
- (3) 求解表达式3。
- (4) 转回上面第(2)步骤继续执行。
- (5) 循环结束,执行for语句下面的一个语
- for语句常见的形式:
- for(循环变量赋初值;循环条件;循环控制语句)
- for(int i = 0; i<10 ; i++){
- 语句块;
- }
- 改写成: while
- int i = 0;
- while (i<10){
- 语句块;
- i++;
- }
- //---------for循环值得注意的地方-----------//
- 1)表达式省略(三个表达式都可以省略)
- 如:for(; ;) 语句相当于while(1) 语句
- 了解:
- 2)循环控制无关的任意表达式
- 表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。
- for(int i=1,j=0;i<=100;i++,j++)
- //---------for循环的嵌套-----------//
- //第一种理解方式:把打印一行的代码,执行了5次
- for (int j=0; j<5; j++) {
- //打印一行 * ,有5个
- for(int i=0;i<5;i++){
- printf("*\t");
- }
- printf("\n");
- }
- //外层控制行数,里层控制列数
复制代码 contine- //---------continue-----------//
- continue语句的作用是跳过循环体中剩余的语句而继续下一次。
- continue语句只用在 for、while、do-while等循环体中,常与if条件语句一起使用,用来"加速循环"。
- break的用法:
- while(表达式1){
- ......
- if(表达式2) break;
- ...... }
- continue的用法:
- while(表达式1){
- ......
- if(表达式2) continue;
- ...... }
复制代码 break- //---------break-----------//
- break和continue语句都可以用在循环中,用来跳出循环(结束循环);
- break语句还可以用 在switch语句中,用来跳出switch语句。
- 当break语句用于
- do while
- for
- while
- 循环语句中时,可使程序终止循环而执行循环后面的语句,通常break语句总是与while语句联在一起,即满足条件时便跳出循环。
- 注意:
- 1)break 用在循环与switch中
- 2)在多层循环中,一个break语句只向外跳一层。
复制代码 修饰变量
const- const修饰的变量 , 是只读的 , 内容不可该
复制代码 const与变量搭配使用
- const int num = 1;
- num++; //错误
- num = 20; //错误
- Cannot assign to variable 'num' with const-qualified type 'const int'
复制代码总结 : const修饰的变量 , 可读不可改 const与指针变量搭配使用 const 在 * 前面 : 指针的指向可以变 , 地址对应的值不可变- int num = 10;
- const int *p = #
- int const *p = #
- 指针的指向可以变 , 地址对应的值不可变
- p = &num2; //这个可以
- 但是 *p = 30; // 这个错误 Read-only variable is not assignable
复制代码 const 在 * 后面 : 指针的指向不可以变 , 地址对应的值可变- int num = 10;
- int * const p = #
- 指针的指向不可以变 , 地址对应的值可变
- p = &num2 ; //这个错误 Read-only variable is not assignable
- *p = 10; // 这个可以
复制代码- 理解: 1.
- const int *p; 常量指针 指向常量的指针 所以值不能变,指向可变
- int const *p;
- int * const p; 指针常量 这是个常量 指向不可变,值可变
复制代码 最后 , 如果还是没法懂 , 就强行记忆 :- const 在 * 的左侧 指向可变,值不能变
- const 在 * 的右侧 指向不可变 值可变
- const 在 * 的两侧 指向和值都不可以变
复制代码 整型变量修饰符以下4个修饰符只能修饰整型 - 定义变量默认被signed修饰 , 代表有符号的整型
复制代码- 定义变量默认被signed修饰 , 代表无符号的整型 .
- 当然 unsigned char ch; 也是正确的 因为char类型底层是字符通过ASCII码转成二进制的整型保存在内存中 , char也分符号
复制代码
static和externstatic
- 修饰函数
- 被static修饰的函数都为内部函数 , 只能在本文件中使用
- 修饰全局变量
- 被static修饰的全局变量都为内部变量 , 只能在本文件中使用
- 修饰局部变量
- 被static修饰的局部变量 , 为静态变量 , 保存在静态区(全局区) , 作用域范围不变, 延长变量的声明周期
extern
- 定义的函数 , 全局变量 , 默认被extern修饰 , 可以跨文件使用
- 被extern修饰的函数都为外部函数 , 可以多文件使用
- 被extern修饰的全局变量都为外部变量 , 可以多文件使用
- extern不能修饰定义局部变量(无意义)
补充 : - 定义局部变量 , 默认就是auto修饰的
- 表示系统会自动回收此局部变量 , 在作用域结束位置
复制代码
|