第四章 运算符

  • 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. VS版本 与 .NET版本以及C#版本之间的关系

    版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual Studio .NET 2002 2002.1 ...

  2. [Example of Sklearn] - 分类对比

    refrence :http://cloga.info/python/2014/02/07/classify_use_Sklearn/ 加载数据集 这里我使用pandas来加载数据集,数据集采用kag ...

  3. DDD实战2 创建领域基础类库项目

    1.创建领域基础类库项目 取名DDD.DomainBase 放置于基础设施层 2.新建IEntity接口,内部创建2个属性 code和Id用于限定 public interface IEntity { ...

  4. 《TIME》时代周刊阅读

    0. 常识 tribunal 是解决民事诉讼和民事纠纷的地方,以调解为主,使用主席制.主席是受过司法培训,具有一定法律基础的,但不能像法官一样直接给你判决,也不能强制执行. Court 一般针对严重案 ...

  5. OpenGL图形渲染管线、VBO、VAO、EBO概念及用例

    图形渲染管线(Pipeline) 图形渲染管线指的是对一些原始数据经过一系列的处理变换并最终把这些数据输出到屏幕上的整个过程. 图形渲染管线的整个处理流程可以被划分为几个阶段,上一个阶段的输出数据作为 ...

  6. 使用python3的base64编解码实现字符串的简易加密解密

    import base64 copyright = 'Copyright (c) 2012 Doucube Inc. All rights reserved.' def main(): #转成byte ...

  7. ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 中间件 上一章节中,我们我们有讲到 Startup 类中的 Confi ...

  8. 分享一下Oracle 10g和Toad for Oracle的安装步骤

    三年前用过Oracle,单纯的“用过”,主要就是说对数据库的一些操作,还不包含创建一些存储过程之类的,所以对Oracle仅仅只是了解一点儿,因为当时那家公司里面,数据库里面的东西都是那些顾问负责的,再 ...

  9. 【Struts2学习笔记(3)】至Action注入属性值

    (1)有属性注入? 当一些属性不适合固定写入时适合使用这样的方法,对于一些使用特频繁的类或者方法,非常多类都会用到,那么使用属性注入会节省很多其它的力气.并且在设计的时候就能够提早的把该属性给定义出来 ...

  10. maven_默认新建项目jdk1.6_默认配置

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...