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因其使用在变量前,可以称其定义的量为常变量或只读变量
变量
变量根据数据类型不同,所占据的字节大小也有不同

而变量根据字节大小有不同计数范围,例如:
char类型为1个字节,一个字节有8个bit位,也就是可以计8位二进制数,最大计数范围就是2^8-1+1(也就是256)
变量可以在数据类型前面加上unsigned(无符号),使变量的数据范围变成非负 (如上例,char的计数范围为-128——127,而改成unsigned char时,计数范围为0-255)
变量分为局部变量和全局变量。两种变量的定义方式相同:数据类型+变量名+初值(在第一条执行语句前赋初值即可,也可以在定义变量的同时就赋初值)
浮点型的变量在赋初值时若只赋整数,则小数部分为0而非不存在


变量具有作用域和生命周期,局部变量只在其定义的那个 { } 内起作用,离开后则立即销毁释放内存;而全局变量则在整个程序内有效。
waring:
整型数据和字符可以任意赋值给int或char,按照赋值的数据的类型来处理即可

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


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


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


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



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

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

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

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


m.n中m(小数点前面的数字)为字符宽度(若输出小数,小数点也算一位),n则根据数据类型不同而有所不同
对于字符型数据,n控制输出字符的个数,若n>=要输出的字符个数,则正常输出,若n<要输出的的字符个数,则砍掉右侧多余字符

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

printf函数
printf的使用格式为:printf(“输出内容”)或printf(“输出内容和格式控制符”,常量或变量)
putchar、puts
putchar一次只能输出一个字符,puts一次则可以输出一个字符串

scanf函数
与printf函数类似,需按照格式输入:scanf(“占位符”,&变量)&为取地址符,若为字符串则不需要取地址
waring:
scanf中“”的格式必须与键盘输入相同,若不同则会造成错误

前后两个scanf函数从键盘中读取时,第一个scanf必须先打空格,后一个则不用
getchar、gets
个体char一次读取一个字符,而gets一次能读取一个字符串
getchar与gets电读取略有不同。getchar需要变量承接而gets不需要。


运算符
算术运算符
单目运算符:+、-(给数据正负号);
双目运算符:+、-、*、/、%(要求整数运算)(自左向右运算)
赋值运算符
赋值:=(自右向左)
关系运算符
>/<、>=/<=、==/!=
逻辑运算符
逻辑与:&&(两侧都为成立才成立)
逻辑非:||(两侧有一侧成立即可
逻辑非:!(真变假,假变真)
优先级:
逻辑非>算术运算符>关系运算符逻辑与>逻辑或>赋值;
多个运算符连续运算时,需要考虑优先级问题(括号优先级最大,可以直接用括号来划分优先级)
分支结构
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)
二维数组
二维数组的基本结构:数据类型+数组名+[数组行数][数组列数]
二维数组的初始化既可以与一维数组相同,也可以利用其独有形式(每一行分别赋值)


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


数字也可以赋值给字符数组,但与字符赋值给整型数组不同,数字赋值给字符数组只能打印出数字本身
也就是说,字符和整型数字在对数组赋初值时无需关注数组类型,按元素类型来写代码即可(与变量时相同)但必须是普通字符数组,字符串不行
waring
字符数组有特殊情况称为字符串。字符串以\0结尾(占据一个元素位,即占字节但不计入数组的有效长度)

唯有字符串可以一次打印整个数组(字符串必须依靠数组存在) :
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:
以上函数只适用于字符串
本文介绍了C语言的基础知识,包括程序结构(主函数和头文件)、数据类型(字符、整型、浮点型等)、常量和变量、输入输出函数(printf,scanf,getchar,gets)以及字符串处理(格式控制、字符串操作函数)。

859





