C语言基础回顾

本文介绍了C语言的基础知识,包括程序结构(主函数和头文件)、数据类型(字符、整型、浮点型等)、常量和变量、输入输出函数(printf,scanf,getchar,gets)以及字符串处理(格式控制、字符串操作函数)。

1.基础c语言语法


 C语言程序由头文件,主函数构成(主函数必不可少,但头文件在不使用的情况下可以不引用)。

C语言的头文件是用来声明所需变量、函数、模块、数据结构及其它各种程序对象的文件,使用头文件可以让C语言代码的编写更加便利。

c语言程序都是从主函数开始逐行执行,遇见return语句结束或执行完主函数内所有代码结束。

waring:

一个C语言程序有且只有一个主函数,但可以使用其他函数来减少主函数中的代码(提高代码的可读性),但定义其他函数时,需要在主函数前进行声明或者是将整个函数写在主函数之前。(若函数无声明,也未写在主函数前,则可能会出现报错)

使用其他函数也可以像#include <stdio.h>一样,将函数封装为库,直接调用头文件,一样可以其他使用其他函数的效果

2.数据类型与常量变量

数据类型

无论是常量还是变量都有以下数据类型:

字符型数据:char(包括字符和字符串,字符串必须依靠数组存在);

整型数据:int(根据数据大小可分为short int、int、long int、long long int)

浮点型数据:float 或double(分为单精度浮点型float和双精度浮点型double;具体表示形式有小数和指数)

枚举类型:enum(枚举常量的数据类型)

指针类型:用于存储内存地址,用于引用其他变量或数据。

数组类型:用于存储多个相同类型的数据。

结构体类型:用于将不同类型的数据组织在一起(可看做是自定义的一种数据类型)

waring

define(宏定义)不是数据类型而是一种预处理指令,不占用内存

常量

常量可以使用difine、const来定义也可以利用显式直接表示

例如:#define  UF  10;

此时UF的值为10,即使后续代码又对UF重新赋值,但只要define定义的值不变,UF的值就不变。

例如:const  int  a = 4 ;

此时a在加了前缀const之后不在是一个变量而是常量且值恒定为4。

例如:int  i = 10 ;

10就是一个整型常量,它的值在代码中被显式地指定为10,并且在程序执行期间不会改变。

enum(枚举)定义的量因其不变也可以看做是常量,枚举可看做是define的群定义,可一次定义多个常量。

根据定义的数不同,常量可分为整型常量、浮点型常量、字符常量、字符串常量         

waring;

deifne定义的量不占用内存,但const定义的量占用内存

const定义的量不可修改,对其修改可能会报错(与define一样,都不可改动,但对define定义的尝试修改不会报错)

const因其使用在变量前,可以称其定义的量为常变量或只读变量

变量

变量根据数据类型不同,所占据的字节大小也有不同

ded051b56b7a491bbf7b3b053fa41eb8.png

而变量根据字节大小有不同计数范围,例如:

char类型为1个字节,一个字节有8个bit位,也就是可以计8位二进制数,最大计数范围就是2^8-1+1(也就是256) 

变量可以在数据类型前面加上unsigned(无符号),使变量的数据范围变成非负 (如上例,char的计数范围为-128——127,而改成unsigned char时,计数范围为0-255)

变量分为局部变量和全局变量。两种变量的定义方式相同:数据类型+变量名+初值(在第一条执行语句前赋初值即可,也可以在定义变量的同时就赋初值)

浮点型的变量在赋初值时若只赋整数,则小数部分为0而非不存在

afb8d6c50c344085becf82140f289028.png1b01bf8ad14644189320677d19e0a2b7.png

变量具有作用域和生命周期,局部变量只在其定义的那个 { } 内起作用,离开后则立即销毁释放内存;而全局变量则在整个程序内有效。

waring:

整型数据和字符可以任意赋值给int或char,按照赋值的数据的类型来处理即可

18e0e0eff55442b780d809f60acb3bc2.png

当数据的值超过过范围时就会循环:

例如char类型的数据仅有256个数,当超过时就会减掉计数范围,直到未超过

802c4511f92b4d439ec63972b272f95c.png30735c9032324577b5a1cb739eeecbc1.png

强制类型转换

(数据类型)变量就是强制改变一个变量的数据类型,但强制类型转换只是在该语句中使参加语句的数据类型发生改变,实际上数据类型并没有改变

318cd42e3d1a44bd8028be93daad5d21.png

ab68fdf950934989aded7182bf77d5b9.png

下图中,强制类型转换前无法取余(取余要求必须是整数参与),强制类型转换后可以但字节大小为8(数据类型仍为double)

f127074fafcd4939bfdc804129261dbe.png

2841c3a3b00c4f96b24c3778ac5b9990.png

3.输入输出函数

格式控制符:

 

格式控制符与数据类型有关,字符型数据用%c(%s为字符中的字符串专用)、整型用%d(八进制用%o,16进制用%x或%X)、浮点型用%f或%lf(float用%f,double用%lf)     

1476e4168a5e43c2a0f7c98d342d3d73.png

                        

5fded619e72849efb6dabc40f87ab4a1.png

4e7e8df98bc84459bd3f35a5e8fc7aa9.png

除此之外,在printf函数中  格式控制符还有多个表示符:%-+0#m.nd(可以单个使用或多个一起使用)

-为让输出字符左对齐

fd191c0a7ee84fc4aede47cdab40592d.png

 

+为让输出的数据产生符号(正数显示+,负数显示符号可直接在数前面加负号) 

30f57d256ed54c0aba75ef743f05885e.png

7e5d5a1afa034ff6a84c8e4562e9acd5.png

0为让补齐的字段长度使用0(默认空格补齐) 

f4fc60be4bd94670b245573c6f2da677.png

 #为让8进制前加0,在16进制前加0X(8进制和16进制都无小数)

9c6534c69b744f43a244ecdd6828aeaa.png

e1133e6402ac404cae5522ead7fe58d7.png

m.n中m(小数点前面的数字)为字符宽度(若输出小数,小数点也算一位),n则根据数据类型不同而有所不同

对于字符型数据,n控制输出字符的个数,若n>=要输出的字符个数,则正常输出,若n<要输出的的字符个数,则砍掉右侧多余字符

2b45cb9b08964086b86f0dc3a6a86517.png

 对于整型和浮点型数据,n控制小数点后的位数,若原位数不足则补齐,超过则砍掉

double a = 1,2;

78aba3ad84ec4910acb055930e025cc0.png

printf函数

printf的使用格式为:printf(“输出内容”)或printf(“输出内容和格式控制符”,常量或变量)

putchar、puts

putchar一次只能输出一个字符,puts一次则可以输出一个字符串

33d5a87ee841463ca9da48ca644a0015.png

scanf函数 

与printf函数类似,需按照格式输入:scanf(“占位符”,&变量)&为取地址符,若为字符串则不需要取地址

waring:

scanf中“”的格式必须与键盘输入相同,若不同则会造成错误

f4857d674e0e4b698666db5912918e89.png

 

前后两个scanf函数从键盘中读取时,第一个scanf必须先打空格,后一个则不用 

getchar、gets

个体char一次读取一个字符,而gets一次能读取一个字符串

getchar与gets电读取略有不同。getchar需要变量承接而gets不需要。

ed6e13f5012e4e0796075e8a9a1e99ef.png1205c1a086a54abd82913e2482c155ea.png

 运算符

算术运算符

单目运算符:+、-(给数据正负号);

双目运算符:+、-、*、/、%(要求整数运算)(自左向右运算)

赋值运算符

赋值:=(自右向左)

关系运算符

>/<、>=/<=、==/!=

逻辑运算符

逻辑与:&&(两侧都为成立才成立)

逻辑非:||(两侧有一侧成立即可

逻辑非:!(真变假,假变真)

优先级:

逻辑非>算术运算符>关系运算符逻辑与>逻辑或>赋值;

多个运算符连续运算时,需要考虑优先级问题(括号优先级最大,可以直接用括号来划分优先级)

分支结构

if(选择)

if语句的基本结构,iif后面的为判断语句,花括号内的为执行语句,判断语句为真,执行if花括号内的语句,否则则执行else语句。

if语句可以单独使用,但else必须配套if才能使用

if(表达式)
{
    语句1;
    语句2
    ......
}
else
{
    语句1;
    语句2
    ......
}

 if也可以如图使用,执行表达式2的条件的是不满足表达式1且满足表达式2(可以无限叠加,最后是else 或者else if皆可)

if(表达式1)
{
}
else if(表达式2)
{
}
else
{
}

 

switch

switch基本结构如图,switch为多分支语句,其作用与多个if是一样的,只不过节省了代码运行的时间(没有一个个判断)

switch的表达式的值必须为整型或字符型   

case后面的值必须为常量不是是一个表达式

case语句一旦开始执行就会不断执行下去,除非语句执行结束或遇到break(除此之外不会停止,无论语句是否属于此case,都会不断执行)         

default为除了已经标出的case之外的所有情况                                                   

switch(表达式)
{
case 常量1:语句1;语句2.......;
case 常量2;语句1;语句2.......;
.
.
.
.
default:语句1;语句2.......;
}

 循环结构

for

for结构的三个条件都可以省略(但两个分号一定要有)

条件1为初始条件,执行条件1后,判断条件2是否为真,为真则进入循环,循环一次后立即执行条件3。每次循环后都要执行条件3,然后判断条件2,条件1只执行一次

for(条件1;条件2;条件3)

{
   执行语句;

}

while

while循环只有一个条件,条件为真则进行循环,循环后再次判断 

while(条件)
{
    语句;
}

do while

do while与while的区别为:do while必定执行一次,而while不一定;do while的()后要加;,而while不用。

while如果能进入循环,则与do while一样,运行结果没有区别

do
{
    语句;
}while(条件);

waring: 

三种循环没有任何区别,可以互相通用。

分支结构和循环结构内各种结构都可以嵌套使用。

循环结构除了根据条件语句跳出外,还可以利用break和continue

break为跳出循环(跳出循环所在的花括号),continue为跳出本次循环(循环依旧执行,只是少了一次循环)

数组

数组基本构成:数据类型+数组名+[元素个数]

例如:int str [10],这样就定义了一个整型、数组名为str、有10个元素数组。

一维数组

上例的形式就是一维数组的形式,int str [10]={0},这样就完成了对数组的初始化初始化结果为{1,0,0,0,0,0,0,0,0,0}(第一位初始化为1,其余默认补0)

二维数组

二维数组的基本结构:数据类型+数组名+[数组行数][数组列数]

二维数组的初始化既可以与一维数组相同,也可以利用其独有形式(每一行分别赋值)

cbb5fd1927e44f82836c5e05682aef28.pngd5baef15686046919937144295652273.png

字符数组

字符数组既可以使用char也可以使用int(将字符转换成ASCII码值储存,赋值时仍然赋字符即可)两种情况都可以打印出字符与其ASCII码值

429f2c283b0d4cf19a2d57552e991a43.pngf3d66894e0834d2087403f9b9225bbcc.png

数字也可以赋值给字符数组,但与字符赋值给整型数组不同,数字赋值给字符数组只能打印出数字本身

也就是说,字符和整型数字在对数组赋初值时无需关注数组类型,按元素类型来写代码即可(与变量时相同)但必须是普通字符数组,字符串不行

waring

字符数组有特殊情况称为字符串。字符串以\0结尾(占据一个元素位,即占字节但不计入数组的有效长度)

2ffe243dfe404fe9b646df5006ca6d14.png

 

唯有字符串可以一次打印整个数组(字符串必须依靠数组存在) :

print(“%s”,字符串数组名);

puts(字符串数组名);

常用字符串函数:

字符串连接函数:

strcat(数组1,数组2);
//将数组2放到数组1后

 

字符串复制函数:

strcpy(数组1,数组2);
//将数组2赋值给数组1
strncpy(数组1,数组2,n);
//将数组2的前n个字节复制到数组1,其余不变

strcpy可以理解为清空后覆盖,strncpy是对指定的前几位执行覆盖操作。

字符串比较函数:


strcmp(字符串1,字符串2);
//直接将字符串写在括号中
strcmp(数组1,数组2);
//将字符串数组名写在括号中
//自左向右比较ASCII码值
//始终相同则字符串大小相同,若出现不同则以第一个不同的字符为准
//数组1大则函数返回值为正
//数组1小则函数返回值为负
//数组相同则函数返回值为零

 

字符串长度测量函数:

strlen(数组名)
//将字符串数组名放在括号中
strlen(字符串)
//将字符串直接放在括号中

字符串结尾的\0不计入长度 

字符串转换小写函数:
 

strlwr(字符串)
//大写字母转变为小写

字符串转换大写函数:
 

strupr(字符串)
//小写字母转化为大写

waring:

 以上函数只适用于字符串

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值