第四章 运算符

  • 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)位运算符&  |~<<  >> ∧ 按优先级从高到低排列的顺序是:
          • 位运算符中求反运算“~“优先级最高,
          • 而左移和右移相同,居于第二,
          • 接下来的顺序是按位与 “&“、按位异或 “∧“和按位或 “|“。
          • 顺序为~  << >>  &  ∧  |  。

3014C语言_运算符的更多相关文章

  1. C语言预处理运算符

    转自C语言预处理运算符 预处理还需要运算符?有没有搞错? ^_^, 没有搞错,预处理是有运算符,而且还不止一个: #(单井号)    -- 字符串化运算符. ##(双井号 )-- 连接运算符 #@   ...

  2. C Primer Plus_第5章_运算符、表达式和语句_编程练习

    Practice 1. 输入分钟输出对应的小时和分钟. #include #define MIN_PER_H 60 int main(void) { int mins, hours, minutes; ...

  3. 怎样让Oracle支持中文? 语言_地域.字符集

    暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区  作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...

  4. C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  5. c语言_常见图片格式判断

    c语言_常见图片格式判断 我想尽各种思路.今天,终于把图片判断搞定了. 在此,我写一下我的思路.希望对那些不想看代码的朋友们有帮助. 常风的的图片格式有:bmp,png,jpg,gif等图片格式. 我 ...

  6. C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...

  7. BZOJ_1212_[HNOI2004]L语言_哈希

    BZOJ_1212_[HNOI2004]L语言_哈希 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写 ...

  8. go语言的运算符

    什么是运算符:运算符用于在程序运行时执行数学或逻辑运算 go语言的运算符如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 一,算数运算符 运算符 描述 实例 + 相加 A ...

  9. 选择排序_C语言_数组

    选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...

随机推荐

  1. Swift语言高速入门

    Swift语言高速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著   ISBN 978-7-121-24328-8 201 ...

  2. 图像块的访问(填充 padding,步长 stride,窗 Window/kernel/filter)

    无填充是有填充的特例(填充为 1). utilities(matlab)-- 图像分块(image2cols.cols2image)(未填充) 1. 一个图像块 ⇒ 返回一个值 输出矩阵的大小: ou ...

  3. Dual Dijkstra search for planning multiple paths

    The dual Dijkstra search for planning multiple paths is performed by: (1) calculating a first shorte ...

  4. poj 3071 可能DP

    http://poj.org/problem? id=3071 推方程不难,可是难在怎么算 dp[i][j]表示第i场时第j仅仅队伍存活下来的概率 方程:dp[i][j]=sigma(dp[i-1][ ...

  5. python 判断一个数为?

    1. 判断一个变量是否数字(整数.浮点数)? instance('a', (int, long, float)) True isinstance('a', (int, long, float)) Fa ...

  6. 44个 Javascript 变态题解析——分分钟让你怀疑人生

    原题来自: http://javascript-puzzlers.herokuapp.com/ 第1题 ["1", "2", "3"].ma ...

  7. HDU-4432-Sum of divisors ( 2012 Asia Tianjin Regional Contest )

    Sum of divisors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. ssm框架插入mysql数据库中文乱码问题解决

    1.      检查web.xml <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-n ...

  9. 简明Python3教程 9.函数

    简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构 ...

  10. kbmmw 中XML 操作入门(跨平台,而且可以与JSON,YAML,BSON 直接互相转换)

    delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使 ...