一、数据类型
数据类型不同,数据在内存中的存储方式就不同;数据类型不同,数据之间的运算规则也不尽相同。
二、运算符,表达式和语句
1、算术运算符:
+ 加法运算符;
– 减法运算符(负号运算符);
* 乘法运算符;
/ 除法运算符:两个整形数据相处的结果是整形数据,如7/3的结果为2,舍去小数部分。
% 取余运算符(模运算符):
①模运算的两个运算对象要求必须是整型数据
;
②如果%运算中有一个运算对象为负数时,运算结果的符号与被除数相同。
运算符+、–的优先级相同,*、/、%的优先级相同,且高于+、–运算符,算术运算符都是左结合的运算符。“–”作为负号运算符是右结合性的。
2、赋值运算符和赋值表达式
C语言的赋值运算符是“=”,双目运算符,优先级高于逗号运算符,右结合性。
赋值表达式: 变量 = 确定的值
将“确定的值”按变量定义的类型存储到给变量分配的内存空间中去。
3、自增自减运算符及含自增自减运算的表达式
自增运算符++和自减运算符––都是单目运算符,运算对象只能变量。
运算规则:
(1)自增自减运算符是后缀运算符时,应先使用自增自减运算符的运算对象运算整个表达式的值,然后再执行自增自减运算。
(2)自增自减运算符是前缀运算符时,应先完成自增自减,然后使用运算后的结果运算整个表达式的值。
4、逗号运算符“,”和逗号表达式
一般形式: 表达式1,表达式2
运算过程是顺序运算表达式1,表达式2的值,并以表达式2的值作为整个逗号表达式的值。
三、循环
程序设计中如果待解决的问题存在重复执行操作时,应使用循环结构来实现。
1、while语句:
while(逻辑量)
循环体语句
循环条件一般是关系表达式或逻辑表达式,也可以是其他任意表达式,运算的结果是逻辑量。
若while后有“;”,表示循环体是空语句。
2、do~while语句:
do
循环体语句
while(逻辑量);
3、for语句
for语句是实现当型循环结构的语句
一般形式:
for(表达式1;逻辑量;表达式2)
循环体语句
for语句的执行过程:
①求解表达式1。
②判断逻辑量,如果为1,则执行循环语句,然后执行第三步;如果为0,则结束循环,执行循环的后续语句。
③求解表达式2,转向第②步执行。
四、分支和跳转
1、if(条件语句)
{
满足条件执行的语句;
}
else if(条件语句)
{
满足条件执行的语句;
}
else if(条件语句)
{
满足条件执行的语句;
}
.
.
.
.
else
{
除了 if 以及 else if 语句执行条件外,剩下的条件执行的语句;
}
注:如果 if 和 else 被用在一段程序中,但是中间没有大花括号{},则 else 和最近的 if 进行配对
2、swich语句
switch(expression)
{
case label1 :
statement1;//当 label1 满足 expression 时,执行statement1
break; //当 case1 执行后跳出 Switch
case label2 :
statement2;
break;
default :
statement3;//如果没有和 expression 匹配的 label ,则执行该语句
}
五、函数
C语言由函数组成,函数是程序的基本组成单位
1、函数定义
一般形式:
类型说明符 函数名(带类型说明的形式参数表列)
{
数据描述部分
算法实现部分
}
①类型说明符:定义函数的类型,函数类型是函数返回值的类型,可以是基本数据类型,也可以是结构体类型,指针类型等。
②函数名是用户标识符。
③带类型说明的形式参数表列说明了函数形参的类型及形参变量名,用逗号分开。
注意:
①函数定义相互独立,互不从属一个函数的定义不能包含在另一个函数内部
②无参函数定义时,函数名之后的括号不能省略
③有参函数定义时,形参表列是带有类型说明的形参表列,每个形参都必须独立声明类型
④return语句中“表达式”值的类型应和函数类型一致,如果两者不一致,则以函数类型为,准自动把“表达式”值转化为函数返回值的类型
⑤有值函数只能返回一个值
2、函数声明
(1)库函数的声明:
#include<头文件>
(2)自定义函数的声明:
类型说明符 被调函数名(形参类型表列);
或:
类型说明符 被调函数名(带类型说明的形参表列);
3种声明方式:
①内部声明:在主调函数内声明被调函数称为内部声明,又称局部声明内部声明应放在主调函数中数据描述部分。
②外部声明:在函数外声明被调函数称为外部声明,又称局部声明,外部声明之后的所有函数都可以使该函数的主调函数。
③缺省声明:当被调函数定义在主调函数之前,可以不声明。
六、数组
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
1、数组的概念和定义
要想把数据放入内存,必须先要分配内存空间。放入5个整数,就得分配5个int类型的内存空间。
例如 int a[5]; 就是定义了一个长度为5的整型数组a。数组都是从0开始,比如a[0]就是数组的第一个数.。
给数组赋值:
a[0]=11;
a[1]=22;
a[2]=33;
a[3]=44;
a[4]=55;
这里的0,1,2,3,4是数组下标。
2、使用步骤
①访问数组
#include<stdio.h>
int main()
{
int a[5],i; //也可以写为a[5]={1,2,3,4,5}
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
for(i=0;i<5;i++){
a[i]=i+1;
}
for(i=0;i<5;i++){
printf("数组中第%d位数是:%d\n",i+1,a[i]);
}
return 0;
}
实现:
数组中第1位数是:1
数组中第2位数是:2
数组中第3位数是:3
数组中第4位数是:4
数组中第5位数是:5。
七、结构体和联合体
1、结构体类型
(1)结构体类型定义一般形式:
struct 结构体类型名
{
类型说明符 成员名1;
类型说明符 成员名2;
…
类型说明符 成员名n;
};
(2)结构体变量的定义
①struct 结构体类型名 结构体变量名表列;
②
struct 结构体类型名
{
类型说明符 成员名1;
类型说明符 成员名2;
…
类型说明符 成员名n;
}结构体变量名表列;
③(该结构体类型只能使用一次)
struct
{
类型说明符 成员名1;
类型说明符 成员名2;
…
类型说明符 成员名n;
}结构体变量名表列;
(3)结构体成员的引用
结构体变量.成员名
其中“.”为结构体成员运算符,所有C语言运算符中它的优先级最高。
2、联合体
(1)联合体定义的一般形式:
union 联合体类型名
{
类型说明符 成员名1;
类型说明符 成员名2;
…
类型说明符 成员名n;
};
(2)联合体变量的定义
①先定义联合体类型,再定义联合体变量。
②定义联合体类型的同时定义联合体变量。
③直接定义联合体变量。
八、指针
在C语言中,指针是一种特殊的变量,它是存放地址的。指针变量前面的“*”表示该变量的类型为指针型变量。
1、一般形式为:
类型说明符 *变量名;
假设定义一个指针变量int *i_pointer用来存放整型变量i的地址,可以通过语句i_pointer = &i;
*为取值操作符(在定义时为声明变量为指针变量),&为取址操作符。
例如:
int i = 2020;//定义整型变量i并赋值2020
int *pointer;//定义一个指针变量
pointer = &i;//取i的地址给指针变量
printf("%d\n",*pointer);//获取指针变量的值
2、指针与指针变量:知道了一个变量的地址,就可以通过这个地址来访问这个变量,因此又把变量的地址称为该变量的“指针”。
C语言中可以定义一类特殊的变量,这些变量专门用来存放变量的地址,称为指针变量。
在定义指针变量时需注意:
①定义指针变量时必须指定基类型。只有相同类型变量的地址才能放到指向对应类型变量的指针变量中。例如整型变量的地址只能放到整型的指针变量中。
②指针变量中只能存放地址(指针),不能将任何非地址类型的数据赋给一个指针变量,否则编译器会将该值当成一个地址来处理。
③C语言中提供了地址运算符&来表示变量的地址,其一般形式为:&变量名;
九、宏定义
不带参数的宏定义:
#define 宏 字符序列
①允许红嵌套定义。
②宏定义是用宏代替字符序列,宏展开时仅做简单替换,不要随意加括号。
③宏定义不是C语句,宏定义后不要随意加分号,如果加分号则分号就是宏体的组成部分。
④程序中用双引号括起来的字符串或单引号括起来的单个字符中包含有与宏相同的符号时,宏展开不置换。