C语言运算符大全

余年寄山水
607次浏览
2021年02月23日 08:00
最佳经验
本文由作者推荐

-

2021年2月23日发(作者:女版文章)


C


语言运算符大全



C


语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。


C



言有三大运算符:算术、关系与逻辑、 位操作。另外,


C


还有一些特殊的运算符,用于完成

< p>
一些特殊的任务。



2.6.1


算术运算符




2-5


列出了


C


语言中允许的算术运算符。在


C


语言中,运算符 “


+




“- ”




*


”和 “


/



的用法与大多数计算机语言的相 同,几乎可用于所有


C


语言内定义的数据类型。当“

< p>
/


”被


用于整数或字符时,结果取整。例如,在整 数除法中,


10/3=3




一元减法的实际效果等于用


-1


乘单个操作数, 即任何数值前放置减号将改变其符号。模运


算符“


%

< p>
”在


C


语言中也同它在其它语言中的用法相同。切 记,模运算取整数除法的余数,


所以“


%


”不能用于


float



doubl e


类型。



最后一行打印一个


0


和一个


1


,因为


1/2


整除时为

0


,余数为


1


,故


1%2


取余数


1


< p>


2.6.2


自增和自减



C


语言中有两个很有用的运算符,


通常 在其它计算机语言中是找不到它们的—自增和自减运


算符,


++



--


。运算符“

++


”是操作数加


1


,而“


--


”是操作数减


1


,换句话说:


x=x+1;



++x; x=x-1;



--x;


自增和自减 运算符可用在操作数之前,也可放在其后,例如:


x=x+1


; 可写成


++x


;或


x++



但在表达式中这两种用法是有区别的。


自增或自减 运算符在操作数之前,


C


语言在引用操作


数之前就先执行加


1


或减


1


操作;运算符在操作数之后,


C


语言就先引用操 作数的值,而后


再进行加


1


或减


1


操作。请看下例:



x=10;


;y=++x;


此时,


y=11


。如果程序改为:



x=10;y=x++;



y=10


。在这两种情况下,


x


都被置为


11


,但区别在于设置的时刻,这种对自增和自减发

< br>生时刻的控制是非常有用的。在大多数


C


编译程序中,为 自增和自减操作生成的程序代码


比等价的赋值语句生成的代码



要快得多,所以尽可能采用加


1


或减< /p>


1


运算符是一种好的选择。



。下面是算术运算符的优先级:



:最 高


++



-


--


-


(一元减)



*



/



%


最低


+



-< /p>


编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计

< br>算顺序。


C


语言



处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。



2.6.3


关系和逻辑运算符



关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻


辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在


一起讨论。关系和逻辑运算符概念中的关键是


True


(真)和


Flase


(假)



C


语言中,非


0



True



0


Flase



使用关系或逻辑运 算符的表达式对


Flase



Ture


分别返回值


0



1(




2-6)

< br>。




< br>2-6


给出于关系和逻辑运算符,下面用


1



0


给出逻辑真值表。关系和逻辑运算符的优


先级比算术运算符低,即像表达式


10>1+12

的计算可以假定是对表达式


10>(1+12)


的计算,< /p>


当然,该表达式的结果为


Flase


。在 一个表达式中允许运算的组合。例如:



10>5&&!(10<9)||3<=4


这一表达式的结果 为


True




。下表给出了关系和逻辑运算符的相对优先级:



:最高!





>= <=


=== !=


=&&


最低


||


同算术表达式一样,在关系或 逻辑表达式中也使用括号来修改原计算顺序。切记,


所有关系和逻辑表达式产生的结果不 是


0


就是


1


, 所以下面的程序段不仅正确而且



将在屏幕上打印数值


1




int x;


;x=100;


;printf(


2 .6.4


位操作符



与其它语言不同,


C


语言支持全部的位操作符(


Bitw iseOperators



。因为


C


语言的设计目


的是取代汇编语言,所以它必须支持汇编语言所具 有的运算能力。位操作是对字节或字中


的位(


bit

< p>
)进行测试、置位或移位处理,这里字节或字是针对


C

标准中的


char



int



据类型而言的。位操作不能用于


float



double


longdouble



void


或其它复杂类型。表


2-7


给出了位操作的操作符。位操作中的


AND



OR



NOT



1


的补码)的真值表与逻辑运算


等价,唯一不同的是位操作是逐位进行运算的。

< p>



如表


2-8


所示,当且仅当一个操作数为


True


时,异 或的输出为


True


,否则为


Flas e




位操作通常用于设备驱动程序, 例如调制解调器程序、磁盘文件管理程序和打印机驱动程


序。这是因为位操作可屏蔽掉某 些位,如奇偶校验位(奇偶校验位用于确保字节中的其它


位不会发生错误通常奇偶校验位 是字节的最高位)





通常我们可把位操作


AND


作为关闭位的手段,这就 是说两个操作数中任一为


0


的位,其结


果中对应位置为


0


。例如,下面的函数通过调用函数

< p>
read_modem()


,从调制解调器端口读


入一个字符,并将奇偶校验位置成


0





字节的位


8


是奇偶位,将该字节与一个位


1


到位


7



1


、位


8



0


的字节进行与操作,可将


该字节的奇偶校验位置成


0


< br>表达式


ch&127


正是将


ch


中每一位同


127


数字的对应位进行与


操作,结果


ch


的位

< br>8


被置成了


0


。在下面的例子中 ,假定


ch


接收到字符



并且奇偶位已


经被置位。




一般来说,位的


AND



OR



XOR


操作通过对操 作数运算,直接对结果变量的每一位分别处


理。正是因为这一原因(还有其它一些原因)


,位操作通常不像关系和逻辑运算符那样用在


条件语句中,我们 可以用例子说明这一点:假定


X=7


,那么

x&&8



Ture(1),


而< /p>


x&8


却为


Flase(0)

< p>



记住,关系和逻辑操作符结果不是

< p>
0


就是


1


。而相似的位操 作通过相应处理,结果可为任意


值。换言之,位操作可以有


0< /p>



1


以外的其它值,而逻辑运算符的计算 结果总是


0



1




移位操作符


>>



<<


将变量的各位按要求向或向左移动。右移语句通 常形式是:



variable>>


右移位数



左移语句是:



variable<<


左移位数



当某位从一端移出时,另一端移入


0


(某些 计算机是送


1


,详细内容请查阅相应


C


编译程序


用户手册)


。切记:移位不同 于循环,从一端移出的位并不送回到另一端去,移去的位永远


丢失了,同时在另一端补< /p>


0




移位操作 可对外部设备(如


D/A


转换器)的输入和状态信息进行译码, 移位操作还可用于


整数的快速乘除运算。如表


2-9

< p>
所示(假定移位时补


0



,左移一位等效于乘


2


,而右移一


位等 效于除以


2





每左移一位乘


2

< br>,注意


x<<2


后,原


x


的信息已经丢失了,因为一位已经从一端出,每右移


一位相当于被


2


除,注意,乘后再除时,除操作并不带回乘法时已经丢掉的高位。 反码操


作符为


~


~


的作用是将特定变量的各位状态取反,即将所有的


1


位置成


0


,所有的


0


位置成


1


。位操作符经常用在加密程 序中,例如,若想生成一个不可读磁盘文件时,可以在文件上


做一些位操作。最简单的方 法是用下述方法,通过


1


的反码运算,将每个字节的每一位取< /p>


反。



原字节


00101100


第一次取反码


11010011


第二次取反码


00101100


注 意,对同一行进行连续的两次求反,总是得到原来的数字,所以第一次求反表示了字


< /p>


节的编码,第二次求反进行译码又得到了原来的值。可以用下面的函数

encode()


对字符进


行编码。




2.6.5 ?


操作符



C


语言提供了一个可以代替某些


if- then-else


语句的简便易用的操作符?。该操作符是三


元的,其一般形式为:



EXP1?EXE2:EXP3


3


EXP1



EXP2



EXP3


是表达式,注意 冒号的用法和位置。



操作符“


?


”作用是这样的,在计算


EXP1


之后,如 果数值为


True


,则计算


EXP2< /p>


,并将结果


作为整个表达式的数值;如果


EXP1


的值为


Flase


,则计算< /p>


EXP3


,并以它的结果作为整个表


达式 的值,请看下例:



x=10;


;y=x>9?100:200;


例中,赋给


y


的数值是


100


,如果


x


被赋给比


9


小的 值,


y


的值将为


200


,若用


if-else



句改 写,有下面的等价程序:



x=10;if(x>9)y=100;


;elsey=200;


;


有关< /p>


C


语言中的其它条件语句将在第


3


章进行讨论。



2.6.6


逗号操作符



作为一个操作符,逗号把 几个表达式串在一起。逗号操作符的左侧总是作为


void(


无 值


)



这意味着其右边表达式的值变为 以逗号分开的整个表达式的值。例如:



x=(y=3,y+1);


这行将


3


赋给


y


,然后将


4


赋给


x


,因为逗号操作符的优先级 比赋值操作符优先级低,所以


必须使用括号。实际上,逗号表示操作顺序。当它在赋值语 句右边使用时,所赋的值是逗


号分隔开的表中最后那个表达式的值。例如,



y=10;x=(y=y-5,25/y);


执 行后,


x


的值是


5

,因为


y


的起始值是


10


,减去


5


之后结果再除以


25


,得到最终结果。



。在某种意 义上可以认为,逗号操作符和标准英语的


and


是同义词。



2.6.7


关于优先级的小结




2-10


列出了


C


语言所有操作符的优先级,其中包括将在本书后面讨论的某些操作符。注


意,所有操作符(除一元操作符和?之外)都是左结合的。一元操作符(


*



&



-


)及操作


符“?”则为右结合。





?


C


语言运算符大全


< br>C


语言共有


34


个运算符,今天 闲来没事就找了一下,现在拿出来分享一下呵:



按优先级排序 ,空行表示优先级下降,


01


为最高,最先算

< br>


14~31


均为双目,左结合




() 01


.圆括号



[] 02


.下标



-> 03


.指针型结构成员



. 04


.结构成员




! 05


.逻辑非



~ 06


.位非



++ 07


.自增



-- 08


.自减



- 09


.取负



(


类型


) 10


.类型转换



* 11


.取内容



& 12


.取地址



sizeof 13


.求字节



此级(


5~13


)均为单目运算,且都为右结合



* 14


.乘



/ 15


.除



% 16


.求余



+ 17


.加



- 18


.减



<< 19


.左移



>> 20


.右移



< 21


.小于


-


-


-


-


-


-


-


-