目录
1. 常见关键字
由ANSI标准定义的C语言关键字共32个:
根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。
1)数据类型关键字
1.基本数据类型(5个)
- void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
- char:字符型类型数据,属于整型数据的一种
- int:整型数据,通常为编译器指定的机器字长
- float:单精度浮点型数据,属于浮点数据的一种
- double:双精度浮点型数据,属于浮点数据的一种
2.类型修饰关键字(4个)
- short:修饰int,短整型数据,可省略被修饰的int。
- long:修饰int,长整形数据,可省略被修饰的int。
- signed:修饰整型数据,有符号数据类型(一般定义常量默认为signed)-------可以存储正数和负数。
- unsigned:修饰整型数据,无符号数据类型-----不能存储负数。
3.复杂类型关键字(5个)
- struct:结构体声明
- union:共用体声明
- enum:枚举声明
- typedef:可将复杂,复合的声明类型转化为新的声明类型别名
- sizeof:得到特定类型或特定类型变量的大小
4.存储级别关键字(6个)
- auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
- static:修饰局部变量时,指定为静态变量,分配在静态变量区,修饰全局变量时,指定为局部变量(只允许本文件引用,其他文件不可引用)修饰函数时,指定函数作用域为文件内部
- register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
- extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的对象的一个“引用“
- const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
- volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
2)流程控制关键字
1.跳转结构(4个)
- return:用在函数体中,返回特定值(或者是void值,即不返回值)
- continue:结束当前循环,开始下一轮循环
- break:跳出当前循环或switch结构
- goto:无条件跳转语句
2.分支结构(5个)
- if:条件语句
- else:条件语句否定分支(与if连用)
- switch:开关语句(多重分支语句)
- case:开关语句中的分支标记
- default:开关语句中的“其他”分治,可选。
3.循环结构(3个)
- for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件
- do:do循环结构,do 1 while(2);的执行顺序是1->2->1...循环,2为循环条件
- while:while循环结构,while(1) 2;的执行顺序是1->2->1...循环,1为循环条件
以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。
注:C语言中没有 string ,要想在C语言中使用字符串,就要在头文件里定义#include<string.h>(引用)而字符串在c++里的定义是#include<string>;在C/C++中使用字符串也就是定义时不一样,其他的都一样。string 是字符串,char是单个的字符。string相当于一个容器,char可以放在里面。string有结束符,char是没有的。string是c++里的,不是c里的。用string存储字符串时,不用设定字符串的长度,而char要设定。还有就是,string有很强很方便的功能,比如可以方便的赋值,方便的比较大小。
2.#define 定义常量和宏
注:C语言是区分大小写的,所以程序中出现的关键字必须严格上一些图片要求使用小写字母,标准库中函数(如printf)的名字也只能包含小写字母。但通常情况下,宏的名字一般是使用大写字母(大小写系统没有要求),因为方便区分同时也是也是大部分C程序员多年沿用的规范。
1) 简单的宏定义
格式:#define <宏名/标识符> <字符串>
#define max 300
int main()
{
printf("%d\n", max);
int arr1[max] = { 0 };
int a = max;
printf("%d\n", a);
return 0;
}
①宏名一般用大写
②宏定义末尾不加;
③可以使用#undef命令终止宏定义的作用域
④宏定义可以嵌套
⑤字符串 “ ” 中永远不包含宏
⑥宏替换在编译前进行,不分配内存,变量定义分配内存,函数调用在编译后程序运行时进行,并且分配内存
⑦预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查
⑧使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
2)带参数的宏定义
格式:#define <宏名>(<参数表>) <宏体>
如:
#define ADD(x,y) ((x)+(y))
int main()
{
int a = 0, b = 0;
printf("输入要计算的两个值:");
scanf("%d %d", &a, &b);
int c = ADD(a, b);
printf("计算结果为:%d", c);
return 0;
}
宏的作用:使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率。
说明:
①实参如果是表达式容易出问题
#define ADD(x) ((x)*(x))
int c = ADD(a+b); 第一步换为c=x*x;第二步换为c=(a+b) *( a+b);
但当定义为 #define ADD(x) x*x
int c=ADD(a+b); 第一步换为 c=x*x; 第二步换为 c=a+b*a+b;
此时,两者关系式优先级不同,结果不同
②宏名和参数的括号间不能有空格
③宏替换之前替换不做计算,不做表达式求解
④宏的哑实结合不存在类型,也没有类型转换
⑤宏展开不占用运行时间,只占用编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
至此C语言入门学习第五篇完结,如果有什么问题,欢迎大家在评论区,讨论、指正。
也希望此文对于你能够有所帮助,谢谢大家~
码字不易,还望支持!