2.运算符,表达式和语句
3.循环
4.分支和跳转
5.函数
6.数组
7.结构体,联合体(重要)
8.指针(重要)
9.宏定义
一.数据类型
例如:
int a = 1;
float b = 1.0;
double c = 1.0;
char ch = 'A';
long d = 1;
printf("a = %d,b = %f,c = %lf,ch = %c,d = %ld", a, b, c, ch, d);
二.运算符 表达式和语句
1.C语言提供五个基本运算符:
+加法运算符
- 减法运算符,负号运算符
* 乘法运算符
/ 除法运算符
%取余运算符(模运算符)
运算符+、-的优先级相同,*、/、%的优先级相同且高于+、-运算符, 算术运算符都是左结合的运算符。“-”作为负号运算符时是右结合性的。
2.算术表达式
用算术运算符和括号(运算符将运算对象连接起来的符合C语言规则的式子,称为算术表达式。符合C语言规则就是符合运算符对运算对象的要求。运算对象必须能够表示 一个“确定值”。反过来讲只要能够表示“确定的值” 的任何内容都可以作为运算对象,如常量、变量、 数组元素、有值函数等。
3.赋值运算符和赋值表达式
C语言的赋值运算符是“=”,赋值运算符是双目运算符,优先级仅高于逗号运算符,是右结合性的。由赋值运算符构成的赋值表达式为:
变量=确定的值
若有如下变量定义:
int a;
float x;
char C;
则下列表达式是符合C语言规则的表达式:
a=123
a=123.456
c=a+ 'A'
X=a+C
a+(x=a+4)/c /*算术表达式*/
(x=a)+(b=3) /*算术表达式*/
而下列的表达式则是非法的:
x=a+b=3 /*第 2个=前的运算对象是表达式a+b,不是变量*/
3=a+C/*运算符=前是常量3,不是变量*/
复合的算术赋值运算符和复合的算术赋值表达式
在赋值运算符“=”前加上其他的运算符,可以构成复合的赋值运算符。如在“=”前加上“:运算符就构成了“+=”运算符。
C语言提供了5种复合的算术赋值运算符,分别是+=、-、*=、/=、 %=,复合的算术腻运算符是双目运算符,优先级和赋值运算符相同,也是右结合性的。
复合的算术赋值运算符构成的复合算术赋值表达式为:
变量复合的算术赋值运算符确定的值
复合算术赋值表达式等效于:变量=变量算术运算符确定的值
例如:
a+=5 等效于a=a+5
x*=y+7 等效于x=x* (y+7)
r%=p 等效于r=r*p
4.自增自减
举例
#include
void main()
{
int i=2,j=3;
k=(i++)+(j++)+4
printf ("result:k=%d, i=%d, j=%d\n",k,i,j) ;
}
程序执行后输出:
result:k=9,i=3,j=4
表达式的运算可理解为:先运算表达式k=i+j+4,再算i++和j++
(2)自增自减返算符是前缀运算符时,应先完成自增自减,然后使用运算后的结果运算整个表达式的值
5.逗号
逗号运算符优先级最低,功能是把两个表达式连接起来组成一个表达式
举例:
#include
void main ()
int a=2,b=4,c=6,x,y;
y=((x=a+b)(b+c));
printf("x=%d,y=%d" ,x,y);
运行结果:
x=6,y=10
本例中的x等于6,y是逗号表达式“(x=a+b)(b+c)” 的值10。如果把“y=((x=a+b),(b+c))”写为“y=(x= a+b),(b+c)”,则y的值为6。
三.循环
1.while语句
while语句是控制表达式在循环体之前的循环语句,它的格式如下:
while (表达式)
这里的圆括号是强制要求的,圆括号之内的表达式为控制表达式,圆括号之外的语句为循环体。
while语句的执行步骤,首先计算控制表达式的值,如果表达式的值不为0(为真),则执行循环体,接着再次判断控制表达式,如果其值不为0,再次执行循环体。执行这个步骤直到控制表达式的值为0时停止。
举例:
#include
void main()
{
float score, sum, average;
int i;
sum=0;
i=0;
while (i<30)
scanf ("%f", &score) ;
sum+=score ;
i++ ;
}
average=sum/ 30;
printf ("average=%. 1f\n", average) ;
程序中语句“i=0;"是设置循环控制变量初值,关系环体中的语句“i++;"是使循环趋于结束的部分
2.do~while语句
do~while语句是实现直到型循环的语句,其一般形式为:
do
循环体语句
while (逻辑量);
其中,while 和do是关键字;语句中的逻辑量可以是任意表达式,反映的是循环的条件;循环体语句有且只能有一条语句; while 之后的分号是do~ while循环语句结束的标志。do~ while语句是一条语句。
do~while语句执行时,首先执行循环体语句,然后判断逻辑量,如果为1,则继续执行循环体语句;如果为0,则结束循环,执行循环的后续语句。do~while 语句是一条语句。
举例:
3.for语句
for语句是实现当型循环结构的语句,for语句是c语言所提供的功能更强,使用更广泛的一种循环语句。其形式为:
for (表达式1;逻辑量;表达式2)
循环体语句
for语句的执行过程如下:
(1)求解表达式1。
(2)判断逻辑量,如果为1,则执行循环体语句,然后执行第3步;如果为0,则结束循环,执行循环的后续语句。
(3)求解表达式2,转向第2步执行。
举例:
四.分支和跳转
1.if语句
形式1:
if (逻辑表达式)
执行语句
如果逻辑表达式为真,则执行执行语句
形式2:
if (逻辑表达式)
执行语句1
else
执行语句2
如果逻辑表示是为真则执行执行语句1,否则执行执行语句2
形式3:
if (逻辑表达式1)
执行语句1
else if (逻辑表达式2)
执行语句2
else
执行语句3
如果逻辑表达式1为真,则自行执行语句1,如果逻辑表达式1为假而逻辑表达式2为真,则执行执行语句2,否则,如果两个表达式都为假,执行执行语句3
2.switch
实现多分支选择结构的switch语句的具体形式如下:switch (表达式)
实现多分支选择结构的switch语句的具体形式如下:
switch (表达式)
{
case常量1:语句组1
case常量2:语句组2
…
case常量n:语句组n
[default : 语句组n+1]
}
五.函数
1.定义
函数是完成定功能的程序段,必须先定义函数,然后才能通过函数调用实现函数定义的功能。函数的定义就是对函数功能的定义。
函数定义的一般形式为:
类型说明符函数名(带类型说明的形式参数表列)
{
数据描述部分
算法实现部分
}
2.函数的调用
math.h:sin(x),cos(x)等
stdio.h:scanf(),printf(),gets(),puts(),getchar(),putchar()等
string.h:strcmp(),strcpy(),strcat(),strlen()等
只有通过函数调用,才能实现函数定义的功能。
函数调用的一般形式为:
函数名(实际参数表列)
函数调用时括号中的参数称为实际参数,简称实参,各实参之间用逗号分开。实参必须是量、变量或表达式等具有确定值的量。
函数调用时,实参与形参数量应相同,类型要匹配,并且按顺序对应。
举例:
3.嵌套和递归
(1)C语言不允许函数嵌套定义。函数定义必须互相独立,互不包含,一个函数的定 义不能包含在另一个函数内部。 但是C语言允许函数嵌套调用。即在被调函数的函数体中可以调用其他函数,并且函数调用可以根据需要多层嵌套。
(2)函数的递归调用是种特殊的嵌套调用。个函数在它的函数体内直接或间接地调用自 身称为函数的递归调用。一个函数直接调用自身,称为直接递归调用,这样的函数称为递归函数。函数A( )调用函数B(),函数B( )又调用了函数A(),称之为间接递归调用。程序设计中常用的是直接递归调用。C语言允许函数递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复用递归函数自身。
六.数组
1.一维数组
一维数组的定义形式为:
类型说明符数组名 [整型常量表达式];
例如:
int a[10];
定义了一个维数组a,包括10个元素,分别用a[0] a[1] .. a[9]表示。数组。中每个元素的数据类型都为int型。
2.二维数组
二维数组的定义形式为:
类型说明符数组名
[整型常量表达式][整型常量表达式2];
“整型常量表达式1”规定了二维数组的行数,称为行长度,记为M;“整型常量表达式2”规定了二维数组的列数,称为列长度,记为N;二维数组元素的个数是M*N。
3.指针数组
指针数组的定义形式如下:
类型说明符* 数组名[整型常量表达式];
其中“类型说明符”用来指定该指针数组的元素可以指向的数据类型。数组名前面的*”"是必须的,表示定义的是一个指针数组。 整型常量表达式用于指明数组元素的个数。和普通数组一样,程序执行时指针数组在内存单元中分配连续的存储空间,指针数组名表示该指针数组的首地址。例如:
int *p[4];
定义了包含4个元素的一维指针数组p,每个元素都可以指向整型数据,即数组中每个元素可用来存放指向整型数据的指针。指针数组在定义形式上与指向一维数组的指针很相似,使用时应注意区别。
举例:
七.结构体,联合体
1.结构体
结构体类型定义的一般形式为:
struct 结构体类型名
{
类型说明符成员名1;
类型说明符成员名2;
...
类型说明符成员名n;
}
其中,struct 是定义结构体类型的关键字,不能省略。结构体类型名遵循标识符命名来标识所定义的结构体类型。花括弧内是该结构体所包含的各个成员,类型说明符用来说明每个成员的类型,它们必须是有效的数据类型,可以是int、float、 double、 char 以及指针、联合体等类型。
例如,定义一个“学生信息”的结构体类型:
struct student
{
int num;
char name[10] ;
char sex ;
int age;
char addr[50];
int score;
};
2.联合体
联合体类型的定义方式与结构体很类似,定义的一般形式为:
union联合体类型名
{
类型说明符 成员名1;
类型说明符 成员名2;
… …
类型说明符 成员名 n;
}
其中,union是定义联合体类型的关键字。联合体类型名遵循标识符命名规则,用来标识所定义的联合体类型。花括弧{}内是联合体中的各个成员,成员名也是一个 合法的标识符,用来标识联合体成员,类型说明符指定每个成员的类型,必须是有效的数据类型。
例如:
union udata
{
int i;
char C;
float f;
};
同定义了一个名为union udata的联合体类型,它由3个成员i, c和f组成,每个成员有各自的数据类型,分别为int、 char 和float,即整型、字符型和单精度型。
八.指针
在C语言中,指针是一种特殊的变量,它是存放地址的。指针变量前面的“*”表示该变量的类型为指针型变量。
一般形式为:
类型说明符 *变量名;
九.宏定义
1.不带参数的宏定义
不带参数的宏定义的一般定义形式如下:
#define宏字符序列
define为宏定义的特定字,宏是用户标识符,字符序列可以是任意字符序列。该命令功能是将字符序列定义为宏。宏起作用的范围是从定义开始到本文件结束。宏定义之后的程序中就可以使用宏表示字符序列。
举例:
2.带参数的宏定义
带参数的宏定义的一般形式如下:
#define宏(形参表列)字符序列
形参表列由一一个或多个参数组成,参数之间用逗号分隔。字符序列中应包含有形参表列中的参数。程序中使用带参数宏,称为宏调用,方法如下:
宏(实参表列)
实参为程序中引用宏的参数。编译预处理时,宏调用展开不是进行简单的字符序列替换,而是使用实参替换字符序列中的形参。
举例:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)