114.C语言_运算符
第四章 运算符node
- 4.1 分类
- C语言的运算符范围很广,可分为如下几类:
- 一、算术运算符:用于各种数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++)、自减(--)共七种。
- 二、赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
- 三、逗号运算符:用于把若干表达式组合成一个表达式(,)。
- 四、关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
- 五、逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
- 六、条件运算符:这是一个三目运算符,用于条件求值(?:)。
- 七、位操做运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
- 八、指针运算符:用于取内容(*)和取地址(&)二种运算。
- 9.、求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
- 十、特殊运算符:有括号(),下标[],成员(→,.)等几种。
- 另外,按参与运算的对象个数,C语言运算符可分为:单目运算符 (如 !)、双目运算符 (如+,- )和三目运算符 (如 ? : )。
- 级别由大到小:(逻辑)非 >算(术运算符) >关(系运算符) >(逻辑)与 >(逻辑)或 >条(件运算符) >赋(值运算符)
- 4.2算术运算符和算术表达式
- 4.2.1 基本的算术运算符与表达式
- 算术运算符
- (1)+(加法运算符或正值运算符,如2+5)。
- (2)-(减法运算符或负值运算符,如4-2)。
- (3)*(乘法运算符,如3*8)。
- (4)/(除法运算符,如11/5)。
- /的运算分为两种状况:
- a、“除”的左右两边都为整数时,所得结果必然是整数(注意:仅取整数部分,不是四舍五入)
- 好比:5/2的值为2,不是2.5,1/2的值为0。
- b、“除”的左右两边至少有一个是实型数据(即小数)时,所得结果为实型数据。
- 好比:5/2.0的值为2.5,7.0/2.0的值为3.5.
- (5)%(模运算符或称求余运算符,%两侧均应为整型数据,如9%7的值为2)。
- 须要说明的是:当运算对象为负数时,所得结果随编译器不一样而不一样,在vc中,结果的符号与被除数相同,好比:13%-2值为1,而-15%2值为-1.
- %符号两边要求是整数。不是整数就错了
- 表达式:
- 是表达式就必定有数值。算术表达式是用算术运算符和括号将运算量(也称操做数)链接起来的、符合C语言语法规则的表达式。运算对象包括函数、常量和变量等。
- 赋值表达式:
- 表达式数值是最左边的数值,a=b=5;该表达式为5,常量不能够赋值。
- 自加、自减表达式:
- 假设a=5,++a(是为6), a++(为5);运行的机理:++a 是先把变量的数值加上1,而后把获得的数值放到变量a中,而后再用这个++a表达式的数值为6,而a++是先用该表达式的数值为5,而后再把a的数值加上1为6,再放到变量a中。 进行了++a和a++后 在下面的程序中再用到a的话都是变量a中的6了。
- 考试口诀:++在前先加后用,++在后先用后加。
- 逗号表达式:
- 优先级别最低 ;表达式的数值逗号最右边的那个表达式的数值。(2,3,4)的表达式的数值就是4。
- 算术表达式和运算符的优先级与结合性
- 在计算机语言中,算术表达式的求值规律与数学中的四则运算的规律相似,其运算规则和要求以下。
- (1)在算术表达式中,可以使用多层圆括号,但括号必须配对。运算时从内层圆括号开始,由内向外依次计算各表达式的值。
- (2)在算术表达式中,对于不一样优先级的运算符,可按运算符的优先级由高到低进行运算,若表达式中运算符的优先级相同,则按运算符的结合方向进行运算。
- (3)若是一个运算符两侧的操做数类型不一样,则先利用自动转换或强制类型转换,使二者具备相同类型,而后进行运算。
- 自增自减运算符
- 做用:使变量的值增1或减1。
- 如:
- ++i,--i (在使用i以前,先使i的值加一、减1)。
- i++,i-- (在使用i以后,使i的值加一、减1)。
- (1)只有变量才能用自增运算符 (++)和自减运算符(--),而常量或表达式不能用,如10++或(x+y)++都是不合法的。
- (2)++和--的结合方向是“自右向左“,如 -i++ ,i的左边是负号运算符,右边是自增运算符,负号运算和自增运算都是 “自右向左“结合的,至关于-(i++)。
- (3)在循环语句中经常使用到自增(减)运算符,在指针中也经常使用到该运算符,区别“i++”和“++i”及“i--”和“--i”,表达式的值和变量的值。
- 例:变量n的初始值为2,则
- 表达式类型 i++ ++i i-- --i
- n值为2时各表达式的值 2 3 2 1
- 通过各表达式运算后变量n的值变化为 3 3 1 1
- (4)l 当++或—与printf语句结合时,若++/--x的形式,则先自增/自减,而后输出;若x++/--的形式,则先输出x原值,在进行自增/自减操做。
- 有如下程序
- #include
- main()
- { int x=011;
- printf("%d\n",++x); //10
- }
- 【解析】011是一个八进制的数,转为十进制则为1*8+1=9;++x是x先自增1再参与其余运算,因此先x自增1为10再输出即为10,故选C。
- 4.3 赋值运算符与赋值表达式
- 4.3.1赋值运算符与赋值表达式
- 赋值符号
- 做用
- 将一个数据赋给一个变量或将一个变量的值赋给另外一个变量,由赋值运算符组成的表达式称为赋值表达式。
- 通常形式为:
- 注意
- 赋值运算符左边必须是变量,而不是表达式。
- 在程序中能够屡次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋值的那个数据。
- 例:a=12; 此表达式读做“将10的值赋值给变量a”。
- 若是赋值号两边的运算对象类型不一致,系统会自动进行类型转换,转换的规则:将赋值号右边表达式的值的类型转换成赋值号左边变量的类型,
- 例:int y=3.5; 在变量y中最终存储的是整数3。
- 能够将赋值表达式的值再赋值给变量,造成连续赋值。
- 例如:x=y=25是一个连续赋值表达式,x=y=25 等价于x=(y=25),因此表达式x=y=25 最终的值为25 。
- 4.3.2复合的赋值运算符
- 在赋值运算符以前加上其余运算符能够构成复合赋值运算符。其中与算术运算有关的复合运算符是:+=,-=,*=,/=,%= 。
- 两个符号之间不能够有空格,复合赋值运算符的优先级与赋值运算符的相同。表达式n+=1等价于n=n+1,做用是取变量n中的值增1再赋给变量n,其余复合的赋值运算符的运算规则依次类推。
- 如求表达a+=a-=a*a的值,其中a的初值为12 。
- 步骤:
- (1)先进行“a-=a*a“运算,至关于a=a-a*a=12-144=-132 。
- (2)再进行“a+=-132“运算,至关于 a=a+(-132)=-132-132=-264 。
- 4.4 逗号运算符和逗号表达式
- 概念
- 在c语言中,逗号除了做为分隔符,还能够用做一种运算符----逗号运算符,用逗号运算符将几个表达式链接起来,例如a=b+c,a=b*c等称为逗号表达式。
- 通常形式为:
- 表达式1 ,表达式2 ,表达式3 , …,表达式n
- 注意
- 逗号表达式具备从左至右的结合性,即先求解表达式1,而后依次求解表达式2,直到表达式n的值。表达式n的值就是整个逗号表达式的值。上述的逗号表达式的值就是表达式z=4的值4.须要注意的是,逗号运算符是全部运算符中级别最低的。
- 例:有以下程序段:
- main()
- {
- inta=2,b=4,c=6,x,y;
- y=(x=a+b),(b+c);
- printf("y=%d,x=%d",y,x);
- }
- 程序显示结果为:y=6,x=6
- 4.5关系运算符和关系表达式
- 4.5.1 C语言中的逻辑值
- C语言中的逻辑值只有两个:真(true)和假(flase)。用非零表明真,用零表明假。所以,对于任意一个表达式,若是它的值为零,就表明一个假值,若是它的值为非零,就表明一个真值。只要值不是零,不论是正数,负数,整数,实数,都表明一个真值。例如-5的逻辑值为真。
- 4.5.2 关系运算符
- 由两个字符组成的运算符之间不能够加空格,关系运算符都是双目运算符。
- (1)结合性:自左向右。
- (2)优先次序:前4种关系运算符( <,<=,>=,> )的优先级别相同,后两种 (==,!=)优先级相同,且前4种优先级高于后两种;关系运算符的优先级低于算术运算符,高于赋值运算符。
- 4.5.3关系表达式
- 由关系运算符链接而成的表达式称为关系表达式。
- 例如:a>b,(a=7)>(b=10)等都是合法的关系表达式。
- 关系表达式的结果有两个:0和1,。其中0表示假,1表示真。若是关系表达式成立,则值为真,若是关系表达式不成立,则值为假。
- 例:变量a的值为5,b的值为6,那么关系表达式a>b的值为假,即为0.而关系表达式
- (a=13)>(b=10)的值为真,即为1。
- 当关系运算符两边值的类型不一致时,若一边是整型,一边是实型,系统将自动把整型数转化为实型数,而后再进行比较。
- 4.6 逻辑运算符和逻辑表达式
- 4.6.1逻辑运算符及其优先级
- C语言提供了3种逻辑运算符
- 优先级 由高到低
- 逻辑运算符 !(逻辑非) 高于 &&(逻辑与)高于 ││(逻辑或)
- 说明:
- “&&”和“||”是双目运算符,要求要有两个操做数,而“!”是单目运算符,只要求有一个操做数便可。
- 以上逻辑运算符的优先级是:“!”(逻辑非)级别最高,其次是“&&”(逻辑与),“||”(逻辑或)级别最低,逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。
- 即:“!”(逻辑非)>算术运算符>关系运算符>“&&”>“||”>赋值运算符>逗号运算符。
- 4.6.2逻辑表达式
- “&&”和“||”的运算对象有两个,故它们都是双目运算符,而!的运算对象只有一个,所以它是单目运算符。
- 逻辑运算举例以下:
- (1)a&&b: 当&&两边都为“真”时,表达式a&&b的值才是真。
- 值得注意的是:在数学中,关系式0<x<10是可使用的,表示x的值应在大于0且小于10的范围内,但在C语言中却不能用0<x<10这样一个关系表达式来表示上述的逻辑关系,即关系运算符不能连用,但能够借助逻辑运算符来辅助运算,正确的表示方法是 0<x && x<10。
- (2)a||b: 当||两边有一个为“真”时,表达式a||b的值就是真。
- (3)!a: 表示取反,若是a为真,则!A为假,反之亦然。例如!-5的值就为0.
- 4.6.3短路
- 在C语言中,由&&或||组成的逻辑表达式,在某些特定状况下会产生“短路“现象。
- (1)x && y && z ,只有当x为真(非0)时,才须要判别y的值;只有x和y都为真时,才须要去判别z的值;只要x为假就没必要判别y和z,整个表达式的值为0。口诀:“一假必假”。
- 例:(!5==1)&&(++i==0) (!5==1)表达式的值为0,因此计算机运行中就跳过(++i==0)此表达式,(!5==1)&&(++i==0)表达式的值为0.
- (2)x||y||z ,只要x的值为真(非零),就没必要判别y和z的值 ,整个表达式的值为1,只有x的值为假,才须要判别y的值,只有x和y的值同时为假才须要判别z的值,口诀:“一真必真”。
- 4.7 位运算
- 4.7.1位运算符与位运算
- 在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。C语言提供6种位运算符。
- 操做符 含义 规则
- & 按位与 若两个相应的二进制位都为1,则该位的结果为1,不然为0
- | 按位或 两个相应的二进制位中只要有一个为1,则该位的结果为1,不然为0
- ^ 按位异或 若两个二进制位同号,则结果为0,异号为1
- 异或的位运算
- 0 异或 1获得一、
- 0 异或 0获得0、
- 1 异或 1获得0,
- 相同为0,不一样为1
- 例 3 ∧
- 设二进制数a是00101101 ,若经过异或运算a∧b使a的高4位取反,低4位不变,则二进制数b是11110000。
- 解析:异或运算经常使用来使特定位翻转,只要使需翻转的位与1进行异或操做就能够了,由于原数中值为1的位与1进行异或运算得0 ,原数中值为0的位与1进行异或运算结果得1。而与0进行异或的位将保持原值。异或运算还可用来交换两个值,不用临时变量。
- 如 inta=3 , b=4;,想将a与b的值互换,可用以下语句实现:
- ~ 按位求反 按位取反,即0变1,1变0
- << 左移 将一个数的二进制所有左移若干位
- 例1<<
- 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位所有左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
- 例如:
- a<<4
- 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
- >> 右移 将一个数的二进制位所有右移若干位
- 例 2>>
- 右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位所有右移若干位,“>>”右边的数指定移动的位数。
- 例如:
- 设 a=15,
- a>>2
- 表示把000001111右移为00000011(十进制3)。
- 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。
- 说明:
- (1)位运算中除“~“之外,均为双目运算符,要求两侧各有一个运算量。
- (2)运算量只能是整型或字符型数据,不能为实型数据。
- (3)在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。
- (4)特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的
- (5)位运算符& |~<< >> ∧ 按优先级从高到低排列的顺序是:
- 位运算符中求反运算“~“优先级最高,
- 而左移和右移相同,居于第二,
- 接下来的顺序是按位与 “&“、按位异或 “∧“和按位或 “|“。
- 顺序为~ << >> & ∧ | 。

欢迎关注本站公众号,获取更多信息