时光荏苒,岁月如梭。自从高二以来,我好像就再也没有碰过c语言,当年记忆中的知识点如今也裂成了一块块碎片。正值暑假之际,考虑到我未来大概率会选择计算机相关专业,所以我决定对c语言进行一个简单的复习,并将过程中的心得记录于此以防再次遗忘。由于只是简单复习,所以大部分知识点不会进行细致的展开,如果您是希望进行更全面的学习的阅读者,这篇总结可能并不能让您满意,还望谅解。不过您也可以直接联系我以进行询问,我会尽己所能帮助您。
1.数据的存储类型及命名
c语言中,数据分为常量与变量两种。
常量编译后不可改变,是一个固定的量。变量是一个可变的量,可在程序运行的过程中随着情况改变而变化。
每一个量(以及函数)都必须有标识符,通俗上标识符就是量的名字。标识符由且尽可由字母、数字、下划线组成,且第一个字符不能是数字。标识符分为关键字、预定义标识符和用户标识符,关键字是c的自保留标识符,不可以使用;预定义标识符已经定义过了,不可以再次定义但可以用使用(如printf)。通常情况下正常编程都不会遇到标识符问题。标识符区分大小写且不能重复。
32个关键字如下表:
标识符有自己的可见域,编程时要注意这一点。在下级域中定义的变量在该域中会屏蔽掉上级域中的同名变量,称为影子变量(尽量别用)。
c的变量和常量最基本分为int、char、float、double、string几种类型。定义方法如下:
int a;//设置整数型变量a
int b = 0;//设置整数型变量b,且初始值为0
char c = 'A';//设置字符型变量c,初始值为A
float d = 1.1;//设置浮点型变量d,初始值为1.1
double e = 1.0000000001;//设置双精度浮点变量e,初始值为.....
string f = 'woshisb';//设置字符串型变量f,初始值......
形如(int) a的代码可以强制转换数据类型,不四舍五入。
八进制数以0开头,十六进制数以0x开头,如011=9,0x11=17。
2.c语言的基本运算符
1.算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++),自减(–)
2.关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)、不等于(!=),其结果用1(true),0(false)表示。所有不为0的判断结果均视为1。
3.赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=、-=,*=、/=、%=)。
4.逻辑运算符:用于逻辑运算。包括逻辑与(&&)、或(||),非(!)。其结果用1,0表示。
5.逗号运算符:用于把若干表达式组合成一个表达式(,),从左往右运行。
3.c语言的输入输出
所以本节中的输入输出函数需包含头文件stdio.h (标准输入输出头文件)
#include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。
输出
printf() 用于格式化输出到屏幕。printf() 函数在 “stdio.h” 头文件中声明
//此程序会输出:Number = 1
#include <stdio.h>
int main()
{
int a = 1;
printf("Number = %d", a);
return 0;
}
其中,%d意味着其对应a的数值,且输出形式为整数,如果有更多,其后一一对应
%d为格式化输出符号,格式化输出符号有:
%d:用于输出十进制整数。
%c:用于输出字符。
%f:用于输出浮点数。
%s:用于输出字符串。
%u:用于输出无符号十进制整数。
%p:用于输出指针。
%x 或 %X:用于输出十六进制数,%x表示输出小写字母,%X表示输出大写字母。
%o:用于输出八进制数。
%e 或 %E:用于输出科学计数法表示的浮点数。
%g 或 %G:用于输出浮点数,但是没有无意义的零。
输入
scanf意思是格式化扫描,也就是从键盘获得用户输入,和 printf 的功能正好相反。scanf() 函数也在 “stdio.h” 头文件中声明
//此程序会输出:Number = 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a); //输入整数并赋值给变量a
printf("Number = %d", a);//输出变量a的整数值
return 0;
}
&为地址符号,代表把输入的数存储变量a的内存地址中
此外还有一些其他不常用的输入方法
getchar()函数从屏幕读取下一个单个字符,并把它返回为一个整数。
gets() 函数可用于从屏幕读取字符串,直到读取到了终止符才会结束。
4.判断语句
if语句
if是c语言中最常用的判断语句,他的最基本用法为
if (/*条件1*/){
/*满足条件1将要运行的代码*/
};
当括号内条件布尔值为1(true)时,将执行下面域内的代码;当布尔值为0(false)时,不会执行下面域内的代码。请注意布尔值中任何非0数都将被视为1
此外,if语句还有其他额外扩展用法,如下:
if (/*条件1*/){
/*满足条件1将要运行的代码*/
}
else if (/*条件2*/){
/*不满足条件1但满足条件2将要运行的代码*/
}
else if (/*条件3*/){
/*不满足条件1、2但满足条件3将要运行的代码*/
}
else {
/*什么都不满足时将执行的代码*/
};
else if是if的拓展语句,必须在if后面和else前面。当其存在时,将从上到下进行条件检测,满足后就会进入对应代码,对应代码运行完后会直接结束整个if语句,不会继续进行判断。
else也是if的拓展语句,必须在最后面,且只能有一个。当else以上的每一个判断都不成立时,将执行else内的内容。
else if与else可单独加入,也可以都有。
if语句内还可以接着套娃if语句
以下是一个非常完整的if语句代码案例(来源网络):
#include <stdio.h>
int main()
{
int a = 19;
if (a < 10)
{
printf("a 的值小于10\n");
}
else if (a < 20)
{
printf("a 的值小于20\n");
}
else if (a < 30)
{
printf("a 的值小于30\n");
}
else
{
printf("没有匹配的值\n");
}
return 0;
}
switch语句
switch是一个相对不常用的判断语句
一个 switch 语句允许测试一个变量等于多个值时的情况,每个值称为一个 case,且被测试的变量会对每个 case进行检查。
int a=1;
switch(a){
case 0;//检测a是否等于0
printf('a等于0');
case 1;//检测a是否等于1
printf('a等于1');
a++;//此时a变成2
case 2;//检测a是否等于2
printf('a等于2');
case 3;//检测a是否等于3
printf('a等于3');
};
将输出”a等于1a等于2“
注意,case中的条件只能为常量,且不能重复。
当运行到break语句时,会直接结束当前正在执行的判断和循环。
5.循环语句
循环结构一共有三种,分别是for语句(♥),while语句,do-while语句
break会直接终止整个循环,而continue会终止当前正在进行的循环并进行下一次循环检测
循环语句可以套娃
while语句
while语句是最基础的循环语句,它的语法如下
while(/*循环进行的条件*/)
{
/*将执行的语句*/
};
当条件满足时,就会执行语句,然后再回来继续检测,直到条件不满足才会结束,以此达到循环
do-while语句
do while语句基本等同while语句,只不过他会先运行一次再判断是否继续循环,语法规则如下。
do
{
/*运行的语句*/
}while( /*继续运行的条件*/ );
for语句
平心而论,for语句是我最喜欢的循环语句,因为它操作简单且覆盖面广。不过他的语法相对复杂。
for ( ini t; /*循环的条件*/; increment )
{
/*运行的语句*/
};
for的括号内有3个部分,彼此之间必须用分号隔开,除了循环条件,另外两个部分可以留空。
int部分,可以用来定义一些控制循环的变量,该变量仅在该for循环可见,且循环终止后会被释放;increment部分,可以配合++、–运算符来完成对一个变量的控制。for循环是先满足循环条件,再运行它的语句。
6.函数
函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main()
函数一般为如下结构:
return_type function_name( parameter list )
{
/*函数内容*/
}
一个函数通常由以下部分组成
- 函数返回值:一个函数可以返回一个值,return_type代表了函数的返回值类型,如果没有返回值,可以使用void类型。
- 函数名:函数的名称,也是标识符
- 参数:调用函数时,向函数发送一个值,这个值是实参。参数可以为空
- 函数内容
使用函数前要先声明,声明的语法:
return_type function_name( parameter list );
意义同上
函数调用时,需输入函数名(参数)
c是穿值调用,这意味着虚参改变不会影响实参
7.指针
指针是一个用来指向地址的变量,他存储的数据是内存中的地址
指针也存在数据类型,但它的数据类型值的是所指向的数据的类型,指针本身的值始终为地址
以下是指针的定义:
int *a; /*一个整型的指针*/
a = &b; /*a指向b的地址*/
定义指针时,须在标识符前面加上*,代表所定义的是指针。&会引出后面的变量的地址
为确保程序运行稳定,推荐为指针赋予初始值NULL,意为空指针(0x0)
int *a = NULL;
8.数组
c语言中允许定义数组,数组是同一类型的数据的集合,你可以将字符串视为字符的数组。
在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
int a[10];//定义一个长度为10的整数数组a
int b[] = {1,2,3,4};//定义一个长度为4的整数数组b且赋予初始值
a[1]=b[1];//为a数组中的第一个数赋予b数组中的第一个数的值
为数组赋予初始值时,赋予的数量必须小于数组长度。当数组没有长度时,长度等于赋予数。
c数组必须有长度,不允许定义不定数组。
使用size可以获取数组长度,具体是用总数组长除于但数据长。
int numbers[] = {1, 2, 3, 4, 5};
int length = sizeof(numbers) / sizeof(numbers[0]);
9.附录
ASCLL表
结语
复习到这里差不多就告一段落了,c其实在实际运用中还有很多细节,但在这里受限于篇幅无法展开,有兴趣的话可以自行查阅。如果您对文章本身有什么不明白的,可以发送在下方评论区。如果这篇文章能帮助到您的话,那对我而言也是不胜感激。
终于完工了  ̄﹃ ̄