114.C语言_运算符

第四章 运算符

  • 4.1 分类
    • C语言的运算符范围很广,可分为以下几类:
      • 1、算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++)、自减(--)共七种。
      • 2、赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
      • 3、逗号运算符:用于把若干表达式组合成一个表达式(,)。
      • 4、关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
      • 5、逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
      • 6、条件运算符:这是一个三目运算符,用于条件求值(?:)。
        • 真前假后
      • 7、位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
      • 8、指针运算符:用于取内容(*)和取地址(&)二种运算。
      • 9.、求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
      • 10、特殊运算符:有括号(),下标[],成员(→,.)等几种。
    • 另外,按参与运算的对象个数,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、减1)。
            • i++,i-- (在使用i之后,使i的值加1、减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
        • 例:x=2,y=3,z=4
    • 注意
      • 逗号表达式具有从左至右的结合性,即先求解表达式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得到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的值互换,可用如下语句实现:
                      • a=a∧b;
                      • b=b∧a;
                      • a=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)位运算符&  |~<<  >> ∧ 按优先级从高到低排列的顺序是:
          • 位运算符中求反运算“~“优先级最高,
          • 而左移和右移相同,居于第二,
          • 接下来的顺序是按位与 “&“、按位异或 “∧“和按位或 “|“。
          • 顺序为~  << >>  &  ∧  |  。

 

 

 

posted @ 2018-11-24 22:25  Zander_Zhao  阅读(994)  评论(0编辑  收藏  举报