一、编程规范
词法符号
1) 关键字
- 具有特殊意义的字符串(32个关键字)
数据类型: char short int long double float enum void存储类型 : auto static register extern const volatile (修饰符)结构体、共用体 struc union控制语句: if else switch case default while for do goto求字节长度 : sizeof符号: signed unsigned取别名: typedef辅助控制语句: return break continue
2) 标识符
- 程序中不能出现仅靠大小写区分的相似的标识符
- 所有宏定义、枚举常数、常量(只读变量)全用大写字母命名,用下划线分割单词
3) 运算符
- 算术运算符(+、-、/、%)
- 赋值运算符
- 关系运算符(比较运算符)
- 逻辑运算符
- 位运算符(&按位与 |按位或 ^按位异或)
- 三元运算符(表达式?表达式1:表达式2)
4) 标点符号
变量、常量命名规则
变量
- 在整个程序的运行过程中,没有变化且不能变化的,我们称之为常量。
- 在程序运行期间,可以改变并且有可能会改变的,我们称之为变量。
-
局部变量 : 在函数内部定义的变量 ; 局部变量没有初始化的时候,值为随机值 ;作用域 : 只作用于当前模块 ;
-
全局变量 : 在函数外部定义的变量 ; 全局变量没有初始化初值为0 ;作用域为全局
- 程序运行时,变量会由数据类型决定占据的存储空间大小
- 一般形式:<存储类型><数据类型><变量名>;
存储类型:
auto : 自动存储,一般都默认为自动存储,可以省略不写 ;static : 静态存储作用 :1. 修饰局部变量延长生命周期;2. 修饰未被初始化的局部变量初值为 03. 限制作用域:修饰全局变量或者函数的时候只允许本文件访问 ;register : 寄存器存储,运行速率快,但是寄存器数量有限extern : 外部存储,一般用作外部说明 ; - 变量名命名规则:
1) 变量名的开头必须是字母或下划线,不能是数字。实际编程中最常用的是以字母开头,而以下划线开头的变量名是系统专用的。
2) 变量名中的字母是区分大小写的。
3) 变量名不能为C语言的关键字!
4) 变量名中不能有空格。(变量名是字母、数字、下划线的组合)
常量
- 整型常量 :23 023 0x23
- 字符/字符串常量:一个字符由单引号,多个用双引号( ‘A’ 、‘3’、“ABC”、“123”)
- 浮点常量:2.5 2.6
- 指数常量:234.56 == 2.3456e+2 0.000023 == 2.3e-5
- 标识常量:宏定义、宏替换(一般用大写表示)
#define MAX 200
二、运算符的使用
算术运算符
- + - * / %(取余数) ++(自增) --(自减)
关系运算符
- > < == >= <= !=
- a >10 && a < 100 :表示10-100这个范围
逻辑运算符
- &&(与) ||(或) !(非)
- 短路法则:如果有多个表达式,第一个为真,后面的表达式就不再判断
- 逻辑运算的结果只有 真 和 假(0为假,非0为真)
位运算
- ~ :对位进行取反
- & :位与(有0出0)
- | :位或(有1出1)
- ^ :异或(不同出1)
- << :左移位(值相当于乘2)
- >> :右移位(值相当于除2)
赋值运算符
- += -= *= /= %= |= ^= >>= <<=
- eg :a += b ===== a = a+b
条件运算符
- 表达式1 ?表达式2 :表达式3
- 1成立,则执行2,否则执行3
逗号运算符
- (表达式1,表达式2,表达式3........,表达式n)
- 结果为表达式n的值,但是前面的表达式会执行
三、输入输出函数
格式输出printf
int printf(const char *format, ...);
格式控制串 输出表
格式控制串:
%[修饰符]格式符 控制输出的格式
普通字符: 原样的输出
格式符:
%d ---> 十进制整数
%o ---> 八进制
%x ---> 十六进制
%u ---> 无符号的十进制
%c ---> 单个字符
%s ---> 字符串
%f ---> 浮点数
%e ---> 指数
%g ---> %f 和 %e 较短的一种
%% --->输出%
修饰符:
m: 输出的域宽,数据长度 < m ,左边补空格,否则实际输出;
.n:
实数: 小数点的位数
字符串:实际输出的位数
-: 左对齐
+: 在指定有符号前面显示正号
l:
ld \ lu \ lx \ lo 精度为long
lf \ le \ lg 精度为double
格式输入scanf
int scanf(const char *format, ...);
功能:从终端读取
参数: 格式控制串 和地址表
返回值:成功返回输入的个数;
在输入字符的时候会产生垃圾字符;
处理垃圾字符:
1、加空格
eg:
scanf("%c %c", &ch1, &ch2);
scanf("%c ", &ch1);
scanf("%c", %ch2);
2、抑制符
eg:
scanf("%c%*c", &ch1);
scanf("%c", %ch2);
输入: A B --》正常得到结果;
3、getchar()
scanf("%c", &ch1);
getchar(); //将一个空格或者回车获取掉
scanf("%c", %ch2);
eg:
scanf("%4d%2d%2d", &year, &mon, &day);
输入:
20230712
结果:year = 2023 mon = 07 day = 12
字符输入输出getchar putchar
函数原型:
int getchar(void);
功能:从终端读取一个字符;
返回值:返回读取到的字符
函数原型:
int putchar(int c);
功能:将一个字符输出到终端;
参数:要输出的子字符
返回值:返回输出的字符
字符串输入输出gets puts
char *gets(char *s);
{
功能:读取一个字符串,将字符串读取到s指向的空间;
参数: s为一个指针变量,指向一片空间的首地址
返回值:返回s
注意:输入的字符串长度应该小于s指向的空间大小;
}
函数原型:
int puts(const char *s);
功能:
将s指向的字符串输出到终端
返回值:输出的字符个数
puts自带换行功能;
换行:
printf("\n");
putchar('\n');
puts("");
puts("hello")
char buf[32] = "hello";
puts(buf);
四、控制语句
if....else
if(表达式)
{
语句块;
}
表示:表达式成立就执行语句块;
//--------------------------------------------------
if(表达式)
{
语句块1;
}
else
{
语句块2;
}
表示: 如果表达式成立就执行语句块1,否则就执行语句块2;
else 总是与最近的一个if相结合;
//--------------------------------------------------
if(表达式1){
语句块1;
}else if(表达式2){
语句块2;
}else if(表达式3){
语句块3;
}
....
else{
语句块n; //以上都不成立执行语句块n;
}
//------------------------------------------------
if(表达式1){
if(表达式2){
.....
if(表达式n){
语句块n; //所有表达式都成立
}else{
语句块n-1; //表达式n不成立,其他表达式都成立
}
}else{
语句块2;//表达式1成立,表达式2不成立;
}
}else{
语句块1;//表达式1不成立
}
switch
switch(表达式){
case 常量表达式1:
语句块1;
break;
case 常量表达式2:
语句块2;
break;
......
case 常量表达式n:
语句块n;
break;
default://表达式和以上常量表达式都不相等执行下面语句
语句块 n+1;
}
goto
eg:
AA:
语句块;
......
goto AA;
while
while(表达式){
循环体;
}
表达式成立,执行循环体;
do.....while
do{
循环体;
}while(表达式);
先执行循环体,再判断表达式;
for
for(表达1;表达式2; 表达式3)
{
循环体;
}
for循环顺序:
执行表达式1;
判断表达式2;
表达式2成立 执行循环体,不成立结束;
执行表达式三;
判断表达式2 ,成立执行循环体,不成立结束;
for循环中的表达式可以省略,但是 ';'不能省略;
如果表达式2省略,相当于死循环;
辅助控制语句
break: 跳出当前循环(用在switch中跳出switch)
continue:结束本次循环继续下一次循环
return:结束当前函数,也作为函数的返回值;