C语言操作符(上) 文章目录一、操作符的含义二、操作符的分类三、运算符功能介绍1. 算术操作符2. 关系操作符3. 逻辑操作符**▲ 逻辑操作符的短路现象**4. (复合)赋值操作符5. 单目操作符6. 条件操作符7. 逗号表达式8.下标引用操作符9.函数调用操作符10.结构成员访问操作符一、操作符的含义操作符(Operator)是一种告诉编译器执行特定的数学或逻辑操作的符号。操作符又称为运算符作为运算对象的变量或者常量称为操作数。操作符左边的操作数称为第一操作数或者左操作数操作符右边的操作数称为第二操作数或者右操作数。操作符同时对两个操作数进行运算的称为双目操作符操作符只对一个操作数进行运算的称为单目操作符。二、操作符的分类●算术操作符、-、*、/、%●移位操作符、●位操作符:、|、^●赋值操作符、、-、*、/、%、、、、|、^●单目操作符!、、- -、、*、、-、~、sizeof、(类型)●关系操作符、、、、、!●逻辑操作符、||●条件操作符? :●逗号表达式,●下标引用操作符[ ]●函数调用操作符( )●结构成员访问操作符.、-三、运算符功能介绍1. 算术操作符(1) (加法运算符)实现两个操作数的加法运算是一个双目操作符。例如inta2;intb3;intcab;//实现两个整型变量的加法运算printf(%d\n,c);//结果为5printf(%d\n,a6);//变量和常量相加结果为8printf(%d\n,34);//常量和常量相加结果为7当只有一个右操作数的时候就是正号它就是一个单目操作符。intn10;printf(%d\n,n);//结果为10同样的 -(减法操作符)实现两个操作数的减法运算。当 - 只有一个右操作数的时候它就是负号就是一个单目操作符。(2) *(乘法操作符)实现两个操作数的乘法运算。键盘上通过shift8键敲出来。*是一个双目操作符。inta3;intb7;printf(%d\n,a*b);//结果为21/(除法操作符)实现两个操作数的除法运算。是一个双目操作符。printf(%d\n,10/5);//打印结果为2printf(%d\n,5/2);//打印结果为2printf(%lf\n,3.0/2);//打印结果为1.500000printf(%lf\n,3.0/2.0);//打印结果为1.500000注意在做两个操作数的除法运算时当/(除号)两边都是整型类型的操作数时则得到的结果只会是整型。比如上面的第二行5/2的结果本应该是2.5但是只会保留整数部分的2而舍弃小数部分。所以以%d的形式打印出的结果就为2。当/(除号)两边至少有一个是浮点数类型的操作数时则就会计算出小数的结果。比如上面的3.0/2、3.0/2.0得到的结果就都是1.5以%lf的形式打印会在屏幕上打印出1.500000(注意以%lf的形式打印小数点后默认会打印出6位)(3) %(取余(模)操作符)用于求两个整型相除以后的余数是一个双目操作符。%运算符要求两个操作数必须是整数计算得到的余数也是整数。printf(%d\n,7%2);//打印结果为1printf(%d\n,14%3);//打印结果为2printf(%d\n,3%5);//打印结果为3注意当被除数小于除数时得到的余数就是被除数。2. 关系操作符关系操作符都是双目操作符。特别多的会用在分支语句或循环语句的条件部分。intage10;if(age18)printf(成年了\n);elseprintf(未成年\n);运行结果charch[10]abcdefg;inti0;while(ch[i]!\0){printf(%c ,ch[i]);ii1;}运行结果上面只举了两个例子其实对于关系操作符很简单。这里只是做简单的介绍(大于)、(大于等于)、(小于)、(小于等于)、(等于)、!(不等于)。(注意在判断是否是等于关系时两个等号才是判断相等而一个等号是赋值。不要混淆)对于关系运算的结果只有0和1两种结果0表示假1表示真。printf(%d\n,32);//打印结果是1printf(%d\n,3!3);//打印结果是0在C语言中非0表示真0表示假。3. 逻辑操作符(1) 逻辑与操作符双目操作符。顾名思义就是并且的意思形式是a ba和b可以是常量、变量或者表达式。当两边的a和b至少有一个为假时整个表达式的结果就为假当两边的a和b都为真时整个表达式的结果才为真printf(%d\n,(32)(79));//打印结果为1printf(%d\n,(32)(3!2));//打印结果为0printf(%d\n,(42)(58));//打印结果为0(2) ||逻辑或操作符双目操作符。逻辑或就是或者的意思。形式为a || ba和b可以是常量、变量或者表达式。当||两边的a和b至少有一个为真时整个表达式的结果就为真当||两边的a和b都为假时整个表达式的结果才为假printf(%d\n,(32)||(79));//打印结果为1printf(%d\n,(76)||(4!4));//打印结果为1printf(%d\n,(42)||(58));//打印结果为0▲ 逻辑操作符的短路现象(1) 逻辑与短路对于表达式a b当左边的a已经是假了那右边的b就不会判断了。因为左边的a已经为假则整个表达式的结果就为假。(2)逻辑或短路逻辑或短路也是相似的对于表达式a || b当||左边的a已经是真了那右边的b就不会判断了。因为左边的a已经为真则整个表达式的结果就为真。对于逻辑操作符的短路现象就是仅仅根据左操作数的结果就能知道整个表达式的结果而不再对右操作数进行计算这就是短路现象。4. (复合)赋值操作符(1) (赋值操作符)赋值运算是将赋值号右边的值赋给左边的变量。赋值号右边的值可以是常量、变量或者表达式而赋值号左边必须是一个变量。(2) 复合赋值运算符(加等于)、-(减等于)、*(乘等于)、/(除等于)、%(模等于)● (加等于)把右操作数加上左操作数的结果再赋值给左操作数。举一个例子就明白了inta5;a3;//等价于aa3printf(%d\n,a);//打印结果为8定义了一个整型变量a并初始化其值为5。a3的意思就是aa3将变量a的值加上常量3后的结果赋给变量a则a的值变为了8。复合赋值操作符其实就是算术运算符结合赋值运算符的一种简化。上面的其他复合赋值操作符也是相应的算术运算符结合赋值操作符的意思。赋值操作符及复合赋值操作符都是双目操作符因为他们都有两个操作数。5. 单目操作符(1) !(非)逻辑反操作符。通俗来说就是将真变为假假变为真。printf(%d\n,32);//打印结果为1printf(%d\n,!(32));//打印结果为0(2) 操作符也叫自增运算符分为前置和后置。① 前置#includestdio.hintmain(){inta1;intba;printf(a %d\n,a);printf(b %d\n,b);return0;}运行结果由上面的代码及结果可知前置的作用是先将变量的值加1以后再使用变量的值。就像上面的例子a可以理解为先让变量a自增1(aa1)然后再使用a的值此时a的值为2(先加1后使用)。你也可以理解为a这个表达式的值就为2当执行完a这个表达式后会使a的值自增1#includestdio.hintmain(){inta1;printf(a %d\n,a);printf(a %d\n,a);return0;}运算结果② 后置#includestdio.hintmain(){inta1;printf(a %d\n,a);printf(a %d\n,a);return0;}运行结果后置的意思就是先使用变量的值然后再让变量的值自增1(先使用后加1)。就像上面的代码a是先使用a的值a的值为1所以a这个表达式的值为1。当a这个表达式执行完毕后会让a的值自增1(aa1)。你可以理解为a这个表达式的值就为原来a的值执行完这条语句后a的值自增1。(3) - -操作符:也叫自减操作符也是分为前置- -和后置- -。用法和意思和前面的操作符类似#includestdio.hintmain(){intn4;//前置--printf(--n %d\n,--n);//先让n自减1然后再使用n的值printf(n %d\n,n);//后置--printf(n-- %d\n,n--);//先使用n的值然后让n自减1printf(n %d\n,n);return0;}运行结果注意无论是前置、- -或是后置、- -到表达式执行完毕后都会使变量的值自增1或者自减1。(4) 取地址操作符顾名思义就是取出变量的地址。#includestdio.hintmain(){intn1;n;//取出变量n的地址int*pn;//将变量n的地址存到指针变量p中return0;}(5) *解引用操作符用于指针(地址)获取指针所指向单元的内容。用法如下#includestdio.hintmain(){inta10;int*pa;*p20;printf(a %d\n,a);//打印结果为20return0;}有了*操作符就多了一种修改变量值的途径。可以通过解引用操作符对指针进行解引用间接的访问指针所指向对象的内容。(6) sizeof操作符用于求一个变量或者类型所占空间的大小单位是字节。#includestdio.hintmain(){intb10;printf(%d\n,sizeof(b));printf(%d\n,sizeofb);printf(%d\n,sizeof(int));return0;}sizeof操作符求变量的大小时后面的( )可以省略。还需要注意的是sizeof操作符中放的如果是表达式则表达式是不会计算的但是会判断表达式最终结果的数据类型由此计算出最终结果的大小(单位字节)。#includestdio.hintmain(){inta10;charb\0;printf(%d\n,sizeof(a10));printf(%d\n,sizeof(bab));return0;}运行结果(7) (类型)强制类型转换。作用就是将表达式的类型转换为括号中类型名指定的数据类型。#includestdio.hintmain(){inta10;floatb3.14f;a(int)b;//将浮点型变量b强制类型转换成整型赋给aprintf(a %d\n,a);//打印结果为3return0;}上面的变量a是一个整型而变量b是一个浮点型数据如果直接将b的值赋给a则类型就不兼容。所以将b强制类型转换成整型(去掉小数点后的值保留整数部分)再赋给a。用法是在变量或者表达式的前面加上一个( )( )内注明要转换的类型。强制类型转换是将所需变量或者表达式的值转换为我们需要的类型不会改变该变量或表达式的值和类型。在后面的学习中会遇到更多强制类型转换的代码这里先做一个大概的了解。6. 条件操作符? :(条件操作符)。条件操作符是C语言中唯一的一个三目操作符意思就是他有三个操作数。#includestdio.hintmain(){inta0;intb0;printf(请输入a和b的值);scanf(%d %d,a,b);intcab?a:b;printf(%d\n,c);return0;}运行结果条件操作符的格式表达式1 表达式2 : 表达式3① 当表达式1的结果为真(非0)时则计算表达式2表达式2的结果就为整个表达式的结果。② 当表达式1的结果为假(0)时那么就计算表达式3表达式3的结果就为整个表达式的结果。上面的3个表达式可以是变量、常量或者表达式。#includestdio.hintmain(){inta0;intb0;printf(请输入a和b的值);scanf(%d %d,a,b);intcab?a-2:b3;printf(%d\n,c);return0;}运行结果7. 逗号表达式表达式1表达式2表达式3…逗号表达式也是一个操作符。用,将各个表达式分隔开(英文半角状态下的逗号)。运算法则是按从左往右的顺序计算各个表达式。#includestdio.hintmain(){intx7;inty9;intm12;intn1;inta(xy1,ym,mn,nxym);printf(x %d y %d m %d n %d a %d,x,y,m,n,a);return0;}运行结果通过上面的代码及运行结果第八行的代码因为( )的优先级高于赋值操作符()所以会先计算( )里面的逗号表达式因为逗号表达式是左结合性所以会从左往右顺序计算各个表达式最后一个表达式的结果就是整个表达式的结果。注意上面第八行的逗号表达式是用( )整体括起来的然后再赋值给变量a。如果没有打( )就是另外一种情况#includestdio.hintmain(){intx7;inty9;intm12;intn1;inta0;axy,ym,mn,nxym;printf(x %d y %d m %d n %d a %d,x,y,m,n,a);return0;}运行结果上面第九行的代码也是逗号表达式只是这里没有对逗号表达式整体打括号因为逗号表达式是C语言中优先级最低的运算符所以相比较于逗号表达式赋值操作符的优先级高就会将xy计算后的值赋值给a而不是将最后一个表达式的结果赋给a。除非像上面一样逗号表达式整体加了括号以后(a(xy,ym,mn,nxym))才会将最后一个表达式的结果赋给a。这里虽然没有整体打括号但由于逗号表达式的左结合性上面第九行的逗号表达式会从左往右依次计算各个表达式。通过上面的输出结果就可以看出来了。8.下标引用操作符[ ]下标引用操作符。是在数组中使用的是一个双目操作符用于访问数组中的元素。#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};inti0;for(i0;i10;i){printf(%d ,arr[i]);}return0;}下标引用操作符也是一个双目操作符[ ]左边的数组名和[ ]中的下标就是它的操作数。其实两个操作数的位置是可以交换的也就是数组名放在[ ]中下标放在[ ]的左边这种也是可以的。9.函数调用操作符( )函数调用操作符在调用函数时函数名后面的( )就是函数调用操作符。( )的操作数是函数名、参数。而且函数调用操作符最少有一个操作数那就是函数名因为有的函数是没有参数的。#includestdio.hintAdd(intx,inty){returnxy;}voidtest(){printf(I am xionger!);}intmain(){intx10;inty20;printf(%d\n,Add(x,y));//这里的()就是函数调用操作符test();//这里的()就是函数调用操作符return0;}10.结构成员访问操作符(1) 结构体成员的直接访问就可以使用.操作符。使用方法是结构体变量.成员名。#includestdio.hstructStu{charname[20];charsex[12];intage;charid[10];};intmain(){structStus1{张三,男,20,202400101};printf(%s %s %d %s\n,s1.name,s1.sex,s1.age,s1.id);//直接访问return0;}运行结果(2)结构体成员的间接访问可以使用-操作符通过结构体指针来实现对结构体成员的间接访问。#includestdio.hstructStu{charname[20];charsex[12];intage;charid[10];};intmain(){structStus1{张三,男,20,202400101};structStu*ps1;printf(%d %s %s %s\n,p-age,p-sex,p-name,p-id);//间接访问return0;}运行结果上面只是初步了解这些操作符的意思和使用方法在后期的学习中还会更深入的接触和学习到上面的众多操作符。上面还有关于位的众多操作符和运算符的优先级还没有学习我们放到下一章节学习。