1,自加自减运算(单目运算)
说明:
(1)运算对象只能是一个变量
2++; /*Error*/
(2)前置是先运算,后引用,而后置是先引用后运算
int i,x;i = 5;x = i++; /*x=i;i=i+1*/i=5;x = ++i; /*i=i+1;x=i;*/
2,运算的优先级
(1)
第一原则:单目运算的优先级高于双目运算
x=*p++ x=*(p++) x=*p,p=p+1x=*++p x=*(++p) p=p+1,x=*p
第二原则:算术运算->关系运算->逻辑运算->赋值运算
a+b>c&&c!=0 ((a+b>c)&&(c!=0))
(2)优先级总表
级别
运算符
结合顺序
1
() [] ->
从左向右
2
! - ++ -- (type) sizeof * &
从右向左
3
* / %
从左向右
4
+ -
从左向右
5
<< >>
从左向右
6
< <= > >=
从左向右
7
== !=
从左向右
8
&
从左向右
9
^
从左向右
10
|
从左向右
11
&&
从左向右
12
||
从左向右
13
? :
从右向左
14
= op=
从右向左
15
,
从左向右
3,三种循环
(1)while循环(当型循环)
**格式:
while(条件表达式)
语句;
表达式:值非0,表示满足条件;值为0,代表不满足条件
语句(复合语句):重复执行部分(循环体)
**流程图:
1557411418551
**举例:
//求s=1+2+3+4+...+100#includevoid main(void){int s=0,i=1;while(i<=100){s=s+i;//s+=i;i++;}printf("s=%d\n",s);}
(2)do-while循环(直到型循环)
**格式:
do{
语句;}
while(条件表达式);
**流程图:
1557411792125
**while循环与do-while循环的区别:
while循环先判断条件,后执行循环体;
do-while循环先执行循环体,后判断条件
**举例:
//求30!#includevoid main(void){float s=1.0;int i=1;do{s*=i;i++;}while(i<=30);printf("301=%f",s);}
(3),for循环
**格式:
for(e1;e2;e3)
statement;
e1:初值表达式
e2:测试表达式
e3:增值表达式
**流程:
1557412308338
**举例:
//求:s=1+2+3+...+100#includevoid main(void){int s,i;for(s=0,i=1;i<=100;i++){s=s+i;}printf("s=%d",s);}
**注意:在for循环中,e1,e2,e3都可以省略。
(4),无限循环和空循环
**条件为恒真的循环-无限循环
while(1){...}do{...}while(1);//靠条件控制的break语句退出循环for( ; ; ){...}
//例:程序等待直到输入字母Afor(;;){ch=getchar();if(ch=='A')break;}
**循环体为空语句的循环-空循环
for(i=1;i<=MAX;t++);//作用:程序延时
4,字符串的比较strcmp(str1,str2)
作用:对str1和str2进行逐位无符号字符比较,直到对应位字符能够确定关系或到串尾为止。返回整型比较结果。
字符的数值关系及是字符的ASCII码值的数值关系。
比较结果
strcmp的值
str1
<0
str1==str2
==0
str1>str2
>0
char str1[]={"abcd"};char str2[]={"abcd"};int iRe1,iRe2,iRe3;iRe1=strcmp(str1,"abdc");iRe2=strcmp(str1,str2);iRe3=strcmp("abcde",str2);
5,数组的常用算法
数组是同类型数据的集合。便于整体处理数据,数组操作的主要算法有:
(1)求极值;
(2)排序;
(3)查找;
6,指针
C语言的指针支持:
#include void main (void ){int x ,*p;x=55;p=&x;printf ( “ %d, %u ”, x, *p) ;*p=65;printf ( “ %d, %u”, x, *p) ;}//int *p; *p=2; /* Error!*/
(1)指针必须指向对象后,才能引用。(2)&和*为互补运算。
7,指针与数组
数组是同类型的变量的集合,各元素按下标的特定顺序占据一
(1)指针与一维数组
通过指针引用数组元素可以分以下三个步骤:
**说明指针和数组
int *p,a[10];
**指针指向数组
p=a; /*指向数组的首地址*/p=&a[0]; /*指向数组的首地址*/
**通过指针引用数组元素
(2)引用数组元素
**三种方法:
下标法: a[ i ]
指针法: *(p+i)
数组名法:*(a+i)
a=p; /*Error!*/
8,动态分配函数 ()
sizeof(x):计算变量x的长度
free(p):释放指针p所指变量的存储空间,即彻底删除一个变量
9,参数传递
(1)函数调用时传送给形参表的实参必须与形参在类型、个数、顺序上保持一致
10,结构体
(1)struct 结构名{
type 成员1 ;
type 成员2 ;
…
type 成员n ;
};
struct:结构标志
结构名:用标识符命名的结构类型名
(2)结构的定义确定了如下两点:
定义结构类型,确定结构中的成员项的名称及类型。
指明该结构类型的变量在内存中的组织形式。
struct Book {char no[15];char name[50];float price;};struct Book b[10]; //正确
struct {char no[15];char name[50];float price;} Book;struct Book b[10]; //错误
typedef struct {char no[15];char name[50];float price;}Book;Book b[10]; //正确
11,结构指针
方式一:(*p).成员项名
方式二:p->成员项名
typedef struct LNode{ElemType data; //数据域struct LNode *next; //指针域}LNode,*LinkList;// *LinkList为Lnode类型的指针
LNode *p LinkList p
12,总结
(1)从编译器的角度理解C语言的语法规则和处理数据的方式
•int x,y,*p;(符号表,变量先定义后使用,定义后有内存单元)
•语句的语法,如赋值语句:x=a+b;(正确) a+b=x;(错误)
•#define N 5; (后面有分号错误,因为N会被定义为“5;”)
•函数调用通过栈,函数内的局部变量作用域,函数参数传递
•在不同的函数中试图改变一个数据,可以通过:
函数return
指针
全局变量
(2)从机器执行的角度理解算法,将算法描述逐句变为程序
•依次: 循环(for,while),注意循环变量的初值和终值
•比较或分情况:分支(if,switch)
•移动:赋值(后移a[i+1]=a[i]; 前移:a[i-1]=a[i];)
•交换:三条赋值
•记录或保存变量的值:一条赋值
•对于链表,常用的三条语句如下:
p=L->next; //p指向首元结点while(p!=NULL) //p未到表尾p=p->next; //p指向下一个结点
另外,指针保留技术:
q=p;p=p->next;