本帖最后由 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语言的进一步学习 .
18.png (143.86 KB, 下载次数: 42)
sjlx
2016-6-24 15:07 上传
基本数据类型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定义类型
定义:给已经存在的数据类型取一个别名
格式: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用于返回值类型 , 返回值类型为void , 表示无返回值 , 无返回值意味值被调函数不需要返回数据给主调函数
retrunreturn关键字就是用于 被调函数返回数据给主调函数
顺序结构
结构体化程序是一个设计思想,规定了一套方法,使程序具有合理的结构,以保证和验证程序的正确性. 这种方法要求程序设计者不能随心所欲地编写程序,而要按照一定的结构形式来设计和编写程序. 它的一个重要目的是使程序具有良好的结构,使程序易于设计,易于 理解,易于调试修改,以提高设计和维护程序工作的效率.顺序结构
分支结构 if / if..else.. / if..else if.. / if..else if..else..
循环结构IF语句if
else
注意点: 分号是语句的结束,在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
//---------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语句的结束。复制代码
casecase
//---------case语句的穿透问题-----------//
case语句执行的过程中,一旦进入某个分支后就会一直执行到switch结束。
为了避免上述情况,使用break语句,可以跳出switch语句.复制代码
defaultdefault
所有case条件不匹配 , 最后就执行deault中的语句复制代码breakbreak
结束break复制代码循环结构引出循环 :
//---------循环结构-----------//
循环结构是程序中一种很重要的结构。
其特点是,在给定条件成立时,反复执行某程序段, 直到条件不成立为止。给定的条件称为循环条件,
反复执行的程序段称为循环体。
循环结构简单来说就是:循环是一次又一次的执行相同的代码块
// 7次 格式
while语句;
do-while语句;
for语句;
一般来说 一个循环需要以下几部分构成:
1)循环控制条件 循环退出的主要依据,来控制循环到底什么时候退出
2)循环体 循环的过程中重复执行的代码段
3)能够让循环结束的语句(递增、递减、真、假等) 能够让循环条件为假的依据,否则退出循环复制代码while语句while
//---------while循环-----------//
while ( 条件表达式 )
{
语句1;
语句2;
....(让条件表达式为假/有一句可以让循环结束)
}
1)while循环的特点:
如果while中的条件一开始就不成立,那么循环体中的语句永远不会被执行
2)while语句的语义是:
如果条件成立,就会执行循环体中的语句“循环体”。然后再次判断条件,重复上述过程,直到条件不成立就结束while循环复制代码dowhile语句do
//---------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循环-----------//
一般形式:
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");
}
//外层控制行数,里层控制列数复制代码continecontine
//---------continue-----------//
continue语句的作用是跳过循环体中剩余的语句而继续下一次。
continue语句只用在 for、while、do-while等循环体中,常与if条件语句一起使用,用来"加速循环"。
break的用法:
while(表达式1){
......
if(表达式2) break;
...... }
continue的用法:
while(表达式1){
......
if(表达式2) continue;
...... }复制代码breakbreak
//---------break-----------//
break和continue语句都可以用在循环中,用来跳出循环(结束循环);
break语句还可以用 在switch语句中,用来跳出switch语句。
当break语句用于
do while
for
while
循环语句中时,可使程序终止循环而执行循环后面的语句,通常break语句总是与while语句联在一起,即满足条件时便跳出循环。
注意:
1)break 用在循环与switch中
2)在多层循环中,一个break语句只向外跳一层。复制代码修饰变量
bianliang.png (19.88 KB, 下载次数: 35)
bl
2016-6-24 15:20 上传
constconst
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个修饰符只能修饰整型short
short num ; // 占2个字节的整型复制代码long
long num ; // 占8个字节的整型复制代码signed
定义变量默认被signed修饰 , 代表有符号的整型复制代码unsigned
定义变量默认被signed修饰 , 代表无符号的整型 .
当然 unsigned char ch; 也是正确的 因为char类型底层是字符通过ASCII码转成二进制的整型保存在内存中 , char也分符号复制代码static和externstatic
修饰函数
被static修饰的函数都为内部函数 , 只能在本文件中使用
修饰全局变量
被static修饰的全局变量都为内部变量 , 只能在本文件中使用
修饰局部变量
被static修饰的局部变量 , 为静态变量 , 保存在静态区(全局区) , 作用域范围不变, 延长变量的声明周期
extern
定义的函数 , 全局变量 , 默认被extern修饰 , 可以跨文件使用
被extern修饰的函数都为外部函数 , 可以多文件使用
被extern修饰的全局变量都为外部变量 , 可以多文件使用
extern不能修饰定义局部变量(无意义)
补充 :auto
定义局部变量 , 默认就是auto修饰的
表示系统会自动回收此局部变量 , 在作用域结束位置复制代码