C语言中的运算符

温柔似野鬼°
572次浏览
2021年02月23日 07:56
最佳经验
本文由作者推荐

-

2021年2月23日发(作者:歌手第五期)



C


语言中的运算符








简单赋值运算符记为


“=”


,由


“= ”


连接的式子称为赋值表达


式。欢迎大家阅读!更多相关信息请关注相关栏目!








无论是加减乘除还是大于小于,都需要用到运算符,在


C


语言中的运算符和我们平时用的基本上都差不多。

< br>运算符包括赋


值运算符、算术运算符、逻辑运算符、位逻辑运算符、位移运算


符、关系运算符、自增自减运算符。大多数运算符都是二目运算


符,


即运算符位于两个表达式之间。


单目运算符的意思是运算符


作用于单个表达式。


(


具体什么是表达式下 一节再说


)






C


语言中的运算符







无论是加减乘除还是大于小于,都需要用到运算符,在


C

< p>
语言中的运算符和我们平时用的基本上都差不多。


运算符包括赋

< p>
值运算符、算术运算符、逻辑运算符、位逻辑运算符、位移运算


符、关系运 算符、自增自减运算符。大多数运算符都是二目运算


符,


即运算 符位于两个表达式之间。


单目运算符的意思是运算符


作用于单个 表达式。


(


具体什么是表达式下一节再说


)






一、赋值运算符







赋值语 句的作用是把某个常量或变量或表达式的值赋值给


另一个变量。符号为‘


=



。这里并不是等于的意思,只是赋值,

< p>
等于用‘


==


‘表示。







注意:赋值语句左边的变量在程序的其他地方必须要声明。









得已赋值的变量我们称为左值,< /p>


因为它们出现在赋值语句的


左边;


产生值 的表达式我们称为右值,


因为她它们出现在赋值语


句的右边。常 数只能作为右值。







例如:







count=5;






total1=total2=0;






第一个赋值语句大家都能理解。







第二个 赋值语句的意思是把


0


同时赋值给两个变量。

< br>这是因


为赋值语句是从右向左运算的,


也就是说从右端开 始计算。


这样


它先


total2=0;


然后


total1=total2;


那 么我们这样行不行呢?







(total1=total2)=0;






这样是 不可以的,


因为先要算括号里面的,


这时


total1=total2


是一个表达式,而赋值语句的左边是不允许表达式存在的 。







二、算术运算符








C


语言中有两个单目和五个双目运算符。







符号







功能







单目正







单目负







乘法







除法







取模









加法







减法







下面是一些赋值语句的例子,







在赋值运算符右侧的表达式中就使用了上面的算术运算符:







Area=Height*Width;






num=num1+num2/num3-num4;






运算符 也有个运算顺序问题,


先算乘除再算加减。


单目正和

< p>
单目负最先运算。







取模运算符


(%)


用于计算两个整数相除所得的余数。例如:







a=7%4;






最终


a< /p>


的结果是


3


,因为


7%4


的余数是


3








那么有人要问了,我要想求它们的商怎么办呢?







b=7/4;






这样


b< /p>


就是它们的商了,应该是


1


< p>






也许有人就不明白了,


7/4


应该是


1.75


,怎么会是

< br>1


呢?这


里需要说明的是,


当两 个整数相除时,


所得到的结果仍然是整数,


没有小数部分。要想 也得到小数部分,可以这样写


7.0/4


或者

< br>7/4.0


,也即把其中一个数变为非整数。







怎样由一个实数得到它的整数部分呢?这就需要用强制类


型转换了。 例如:







a=(int)






(7.0/4);








因为


7.0/4


的值为

1.75


,如果在前面加上


(int)

就表示把结果


强制转换成整型,这就得到了


1


。那么思考一下


a=(float)






(7/ 4);


最终


a


的结果是多少?







单目减运算符相当于取相反值,


若是 正值就变为负值,


若是


负数就变为正值。







单目加运算符没有意义,纯粹是和单目减构成一对用的。







三、逻辑运算符







逻辑运 算符是根据表达式的值来返回真值或是假值。


其实在


C


语言中没有所谓的真值和假值,只是认为非


0


为 真值,


0


为假


值。






符号







功能












逻辑与







逻辑或







逻辑非







例如:







5!3;






0||-25;






!4;






当表达 式进行运算时,


只要有一个为假,


总的表达式就为假,


只有当所有都为真时,总的式子才为真。当表达式进行


||


运算时,




只要有一个为 真,总的值就为真,只有当所有的都为假时,总的


式子才为假。


逻辑非


(!)


运算是把相应的变量数据转换为相应的真


/


假值。若原先为假,则逻辑非以后为真,若原先为真,则逻辑


非以后为假。







还有一点很重要,


当一个逻辑表达式的后一部分的取值不会


影响整个表达式的值时,后一部分就不 会进行运算了。例如:







a=2,b=1;






a||b-1;






因为


a= 2


,为真值,所以不管


b-1


是不是真 值,总的表达式


一定为真值,这时后面的表达式就不会再计算了。







四、关系运算符







关系运 算符是对两个表达式进行比较,返回一个真


/


假值。

< p>






符号







功能












大于












小于







=






大于等于







=






小于等于









等于







不等于







这些运算符大家都能明白,主要问题就是等于


==

< br>和赋值


=



区别了。

< p>






一些刚开始学习


C

< br>语言的人总是对这两个运算符弄不明白,


经常在一些简单问题上出错,

< p>
自己检查时还找不出来。


看下面的


代码:







if(Amount=123)






很多新 人都理解为如果


Amount


等于


12 3


,就怎么样。其实


这行代码的意思是先赋值

< br>Amount=123


,然后判断这个表达式是


不是真值 ,因为结果为


123


,是真值,那么就做后面的。如果想


让当


Amount


等于


123


才运行时,应该


if(Amount==123)






……








五、自增自减运算符







这是一 类特殊的运算符,自增运算符


++


和自减运算符


--


对变


量的操作结果是增加


1


和减少


1


。例如:

< br>






--Couter;






Couter--;






++Amount;






Amount++;






看这些例子里,

< br>运算符在前面还是在后面对本身的影响都是


一样的,都是加


1


或者减


1


,但是当把他们作为其他 表达式的一




部分,


两者就有区别了。


运算符放在变量前面,


那么在运算之 前,


变量先完成自增或自减运算;


如果运算符放在后面,


那么自增自


减运算是在变量参加表达式的运算后再运算。


这样讲可能不太清


楚,看下面的例子:







num1=4;






num2=8;






a=++num1;






b=num2++;






a=++num1;


这总的来看是一个赋值,把

++num1


的值赋给


a



因为自增运算符在变量的前面,所以


num1


先自增加


1


变为


5


然后赋值给


a


,最终

< p>
a


也为


5



b=num2++;


这是把


num2++

< p>
的值赋



b


,因为自增运 算符在变量的后面,所以先把


num2


赋值给

< br>b



b


应该为

< br>8


,然后


num2


自增加


1


变为


9








那么如果出现这样的情况我们怎么处理呢?







c=num1+++num2;






到底是


c =(num1++)+num2;


还是


c=num1+(++n um2);


这要根据


编译器来决定,


不 同的编译器可能有不同的结果。


所以我们在以


后的编程当中,应 该尽量避免出现上面复杂的情况。







六、复合赋值运算符







在赋值 运算符当中,还有一类


C/C++


独有的复合赋值运算


符。它们实际上是一种缩写形式,使得对变量的改变更为简洁。







Total=Total+3;








乍一看这行代码,似乎有问题,这是不可能成立的。其实还


是老样子 ,


=


是赋值不是等于。它的意思是本身的值加

< br>3


,然后


在赋值给本身。为了简化,上面的代码也可以写 成:







Total+=3;






复合赋值运算符有下列这些:







符号







功能







加法赋值







减法赋值







乘法赋值







除法赋值







模运算赋值







=






左移赋值







=






右移赋值







=






位逻辑与赋值







位逻辑或赋值







位逻辑异或赋值







上面的 十个复合赋值运算符中,


后面五个我们到以后位运算


时再说明。










么看了上


面的复合赋


值运

< br>算符,有人


就会


问,到底


Tot al=Total+3;



Total+=3;













对< /p>



A=A+1


,表达式

< br>A


被计算了两次,对于复合运算符


A+=1


,表达



A


仅计算了一次。 一般的来说,这种区别对于程序的运行没


有多大影响,


但是当表 达式作为函数的返回值时,


函数就被调用


了两次


(


以后再说明


)


,而且如果使 用普通的赋值运算符,也会加


大程序的开销,使效率降低。







七、条件运算符







条件运 算符


(?:)



C

语言中唯一的一个三目运算符,它是对


第一个表达式作真


/


假检测,然后根据结果返回两外两个表达式


中的一个。







表达式


1?


表达式


2:


表达式


3






在运算中,首先对第一个表达式进行检验,如果为真,则返


回表达式


2


的值;如果为假,则返回表达式


3< /p>


的值。







例如:







a=(b0)?b:-b;







b0< /p>


时,


a=b




b


不大于


0


时 ,


a=-b



这就是条件表达式。


其实上面的意思就是把


b


的绝对值赋值给< /p>


a


。八、逗号运算符








C


语言中,


多个 表达式可以用逗号分开,


其中用逗号分开


的表达式的值分别结算 ,


但整个表达式的值是最后一个表达式的


值。

< br>






假设


b=2,c=7,d=5,








a1=(++b,c--,d+3);






a2=++b,c--,d+3;






对于第一行代码,有三个表达式, 用逗号分开,所以最终的


值应该是最后一个表达式的值,也就是


d+3


,为


8


,所以

< br>a=8



对于第二行代码,


那么 也是有三个表达式,


这时的三个表达式为


a2=++b



c--



d+3,(


这是因为赋值运算符比逗号运算符优先级高


)

< br>所以最终表达式的值虽然也为


8


,但

a2=3








还有其 他的如位逻辑运算符,


位移运算符等等,


我们等到讲

< p>
位运算时再说明。








九、优先级和结合性







从上面 的逗号运算符那个例子可以看出,


这些运算符计算时


都有一定的 顺序,


就好象先要算乘除后算加减一样。


优先级和结

< p>
合性是运算符两个重要的特性,


结合性又称为计算顺序,

< br>它决定


组成表达式的各个部分是否参与计算以及什么时候计算。

< br>






下面是


C


语 言中所使用的运算符的优先级和结合性:







优先级







运算符







结合性







(


最高


)






-






自左向右














sizeof






自右向左







自左向右







自左向右

















自左向右












=











=






自左向右







自左向右












自左向右







自左向右







自左向右












自左向右







自左向右







自右向左







=


-


-


-


-


-


-


-


-