C语言运算符的优先级_精品文档.pdf
- 文档编号:3216298
- 上传时间:2022-11-20
- 格式:PDF
- 页数:11
- 大小:166.59KB
C语言运算符的优先级_精品文档.pdf
《C语言运算符的优先级_精品文档.pdf》由会员分享,可在线阅读,更多相关《C语言运算符的优先级_精品文档.pdf(11页珍藏版)》请在冰豆网上搜索。
1运算符及其优先级运算符及其优先级优先级优先级运算符运算符名称或含义名称或含义使用形式使用形式结合方向结合方向优先级优先级运算符运算符名称或含义名称或含义使用形式使用形式结合方向结合方向数组下标数组名常量表达式=等于表达式=表达式()圆括号(表达式)/函数名(形参表)7!
=不等于表达式!
=表达式左到右.成员选择(对象)对象.成员名8&按位与表达式&表达式左到右1-成员选择(指针)对象指针-成员名左到右9按位异或表达式表达式左到右-负号运算符-表达式10|按位或表达式|表达式左到右(类型)强制类型转换(数据类型)表达式11&逻辑与表达式&表达式左到右+自增运算符+变量名/变量名+12|逻辑或表达式|表达式左到右-自减运算符-变量名/变量名-13?
:
条件运算符表达式1?
表达式2:
表达式3右到左*取值运算符*指针变量=赋值运算符变量=表达式&取地址运算符&变量名/=除后赋值变量/=表达式!
逻辑非运算符!
表达式*=乘后赋值变量*=表达式按位取反运算符表达式%=取模后赋值变量%=表达式2sizeof长度运算符sizeof(表达式)右到左+=加后赋值变量+=表达式/除表达式/表达式-=减后赋值变量-=表达式*乘表达式*表达式=左移后赋值变量=右移后赋值变量=表达式+加表达式+表达式&=按位与后赋值变量&=表达式4-减表达式-表达式左到右=按位异或后赋值变量=表达式左移变量右移变量表达式左到右15,逗号运算符表达式,表达式,左到右大于表达式表达式=大于等于表达式=表达式小于表达式表达式6=小于等于表达式(0x1000)|_|_|_|_|_|a1|-|4|5|6|7|-(0x1010)|_|_|_|_|_|a2|-|8|9|10|11|-(0x1020)|_|_|_|_|_|但从二维数组的角度来看,a代表二维数组的首地址,当然也可看成是二维数组第0行的首地址,a+1就代表第1行的首地址,依次。
如果此二维数组的首地址为0x1000,由于第0行有4个整型元素,所以a+1为0x1010。
既然我们把a0,a1,a2看成是一维数组名,可以认为它们分别代表它们所对应的数组的首地址,也就是讲a0代表第0行中第0列元素的地址,即&a00,a1是第1行中第0列元素的地址,即&a10,根据地址运算规则,a0+1即代表第0行第1列元素的地址,即&a01,一般而言,ai+j即代表第i行第j列元素的地址,即&aij。
另外,在二维数组中我们还可用指针的形式来表示各元素的地址,如a0与*(a+0)等价,ai与*(a+i)等价,它表示数组元素ai的地址&ai0。
而二维数组元素aij可表示成*(ai+j)或*(*(a+i)+j),或者写成(*(a+i)j。
三三、指向一个由指向一个由nn个元素所组成的数组指针个元素所组成的数组指针数组指针用的比较少,但在处理二维数组时,还是很方便的。
例如:
int(*p)4;/*在数组指针的定义中,圆括号是不能少的,否则它是指针数组*/inta34;p=a;开始时p指向二维数组第0行,当进行p+1运算时,根据地址运算规则,此时放大因子为4x4=16,所以此时正好指向二维数组的第1行。
和二维数组元素地址计算的规则一样,*p+1指向a01,*(p+i)+j则指向数组元素aij。
四四、指针数组指针数组因为指针是变量,因此可设想用指向同一数据类型的指针来构成一个数组,这就是指针数组。
数组中的每个元素都是指针变量,根据数组的定义,指针数组中每个元素都为指向同一数据类型的指针。
格式:
类型标识*数组名整型常量表达式;例如:
int*a10;以上指针数组中包含10个指针变量a0,a1,a2,.,a9,可以指向10个不同的地址。
3指针函数和函数指针指针函数和函数指针一一、指针函数指针函数指针函数是指声明其返回值为一个指针的函数,实际上就是返回一个地址给调用函数。
格式:
类型说明符*函数名(参数)例如:
void*GetDate(intID);二二、函数指针函数指针指向函数的指针包含了函数的地址,可以通过它来调用函数。
格式:
类型说明符(*函数名)(参数)例如:
int(*fptr)(intID);其实这里不能称为函数名,应该叫做指针的变量名。
这个特殊的指针指向一个返回整型值的函数。
指针的声明笔削和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。
如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
可以采用下面的形式定义函数指针数据类型:
typedefint(*T_MY_FUNC)(intID);/*此时”T_MY_FUNCfptr;”等价于”int(*fptr)(intID);”*/可以采用下面的形式把函数的地址赋值给函数指针:
fptr=&Function;/*或用“fptr=Function;”*/可以采用下面的形式通过指针来调用函数:
(*fptr)(ID);/*或用“fptr(ID);”的格式,使用这种调用格式看上去与调用普通函数无异,因此使用前一种调用格式可以明确指出是通过指针而非函数名来调用函数的。
*/三三、指针的指针指针的指针指针的指针用于指向指针的地址,它的声明有两个星号。
例如:
char*cp;如果有三个星号,那就是指针的指针的指针,有四个星号那就是指针的指针的指针的指针,依次类推。
四四、指向指针数组的指针指向指针数组的指针指针的指针另一用法是处理指针数组。
有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。
char*Names=Bill,Sam,Jim,0;main()char*nm=Names;/*定义一个指向指针数组的指针的指针*/while(*nm!
=0)printf(%sn,*nm+);4可变参数可变参数的的函数函数下面是一个简单的可变参数的函数,该函数至少有一个整数参数,第二个参数也是整数,是可选的。
#includevoidsimple_va_fun(inti,.)va_listarg_ptr;intj=0;va_start(arg_ptr,i);/*va在这里是可变参数(variable-argument)的意思*/j=va_arg(arg_ptr,int);va_end(arg_ptr);printf(%d%dn,i,j);return;从这个函数的实现可以看到,使用可变参数应该有以下步骤:
1)#include2)在函数里定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数的指针。
3)用va_start宏初始化变量arg_ptr,该宏的第二个参数是第一个可变参数的前一参数,是一固定的参数。
4)用va_arg返回可变的参数,并赋值给j。
va_arg的第二个参数是要返回的参数的类型,这里是int型。
5)最后用va_end宏结束可变参数的获取。
下面的例子可以进一步加深对可变参数的理解,该函数的效果与sprintf函数完全相同:
voidmy_printf(char*buffer,constchar*format,.)va_listarg_ptr;va_start(arg_ptr,format);vsprintf(buffer,format,arg_ptr);/*将arg_ptr按format格式打印到buffer中*/va_end(arg_ptr);位域的使用位域的使用位域的定义和位域变量的说明与结构定义相仿,其形式例如为:
structbsinta:
8;intb:
2;int:
2/*无位域名,该2bit不能使用*/intc:
4;对于位域的定义尚有以下几点说明:
1.一个位域必须存储在同一个字节中,不能跨两个字节。
如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。
也可以有意使某位域从下一单元开始。
52.由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3.位域可以无位域名,这时它只用来作填充或调整位置。
无名的位域是不能使用的。
链链表表typedefstructstudentintnumber;intscore;structstudent*next;STUDENT_LINK;/*建立一个有cnt个结点的链表,返回链表头*/STUDENT_LINK*link_creat(intcnt)STUDENT_LINK*head=NULL;/*head始终指向链表头,用于返回*/STUDENT_LINK*new_node;/*new_node始终指向新申请的节点*/STUDENT_LINK*cur_node;/*cur_node始终指向当前操作的(也是最后的)节点*/intn=1;while(nnext=new_node;cur_node=new_node;/*让cur_node始终指向当前的(也是最后的)节点*/cur_node-next=NULL;/*不要忘记让最后的节点的next指向NULL*/n+;return(head);/*删除链表中number字段为num的结点,并返回链表头*/STUDENT_LINK*link_delete(STUDENT_LINK*head,intnum)STUDENT_LINK*cur_node;/*cur_node始终指向当前操作的节点*/STUDENT_LINK*pre_node;/*pre_node始终指向当前操作的节点的上一个节点*/6if(head=NULL)printf(这个链表是空的,请先建立一个链表.n);return(head);cur_node=head;while(cur_node-number!
=num&cur_node-next!
=NULL)/*当前节点不是要删除的也不是最后的节点*/pre_node=cur_node;cur_node=cur_node-next;/*将cur_node向后移一个结点*/if(cur_node-number=num)/*在链表中找到了要删除的结点*/if(cur_node=head)/*要删除的是头结点*/head=cur_node-next;elsepre_node-next=cur_node-next;free(cur_node);printf(学号为%d的节点已经从链表中删除.n,num);else/*在链表中没有找到要删除的结点*/printf(您想要删除的结点不在此链表中.n);return(head);/*插入一个新结点到链表的最后,并返回链表头*/STUDENT_LINK*link_insert(STUDENT_LINK*head,STUDENT_LINK*node)STUDENT_LINK*cur_node;/*cur_node始终指向当前操作的节点*/if(head=NULL)head=node;elsecur_node=head;while(cur_node-next!
=NULL)7cur_node=cur_node-next;/*将cur_node向后移一个结点*/cur_node-next=node;node-next=NULL;/*不要忘记让最后的节点的next指向NULL*/printf(这个节点已经插入当前链表的最后.n);return(head);/*用户输入一个节点*/voidlink_input(STUDENT_LINK*node)/*输出一个链表*/voidlink_output(STUDENT_LINK*head)STUDENT_LINK*cur_node;intcnt=0;cur_node=head;printf(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 运算 优先级 精品 文档