基础之运算符

原创 2010年06月02日 14:29:00

C语言 的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言 有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。
1算术运算符
表2-5列出了C语言 中允许的算术运算符。在C语言 中,运算符“+”、 “-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言 内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。
一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言 中也同它在其它语言中的用法相同。

切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。


最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。
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,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码
要快得多,所以尽可能采用加1或减1运算符是一种好的选择。
下面是算术运算符的优先级:
最高++、--
*、/、%最低+、- 。编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言 处理括号的方法与几乎所有的计算机语言相同——即强迫某个运算或某组运算的优先级升高。
3关系和逻辑运算符
关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。关系和逻辑运算符概念中的关键是True(真)和Flase(假)。

C语言 中规定,非0为 True,0为Flase

使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。

表2-6给出于关系和逻辑运算符,下面用1和0给出逻辑真值表。关系和逻辑运算符的优先级比算术运算符低,即像表达式10>1+12的计算可以假定是对表达式10>(1+12)的计算,当然,该表达式的结果为Flase。在一个表达式中允许运算的组合。例如:
10>5&&!(10<9)||3<=4
这一表达式的结果为 True。
下表给出了关系和逻辑运算符的相对优先级:
最高 !
>= <=
=== !=
=&&
最低||,同算术表达式一样,在关系或逻辑表达式中也使用括号来修改原计算顺序。

切记,所有关系和逻辑表达式产生的结果不是0就是1, 所以下面的程序段不仅正确而且将在屏幕上打印数值1。
int x;
x=100;
printf("%d",x>10);
4 位操作符
与其它语言不同,C语言 支持全部的位操作符(BitwiseOperators)。因为C语言 的设计目的是取代汇编 语言,所以它必须支持汇编 语言所具有的运算能力。位操作是对字节或字中的位(bit)进行测试、置位或移位处理,这里字节或字是针对C标准中的char和int数据类型而言的。位操作不能用于 float、double、longdouble、void或其它复杂类型。表2-7给出了位操作的操作符。位操作中的AND、OR和NOT(1的补码)的真值表与逻辑运算等价,唯一不同的是位操作是逐位进行运算的。

如表2-8所示,当且仅当一个操作数为True时,异或的输出为True,否则为 Flase。
位操作通常用于设备驱动程序,例如调制解调器程序、磁盘文件管理程序和打印机驱动程序。这是因为位操作可屏蔽掉某些位,如奇偶校验位(奇偶校验位用于确保字节中的其它位不会发生错误通常奇偶校验位是字节的最高位)。

通常我们可把位操作AND作为关闭位的手段,这就是说两个操作数中任一为0的位,其结果中对应位置为0。

例如,下面的函数 通过调用函数 read_modem(),从调制解调器端口读入一个字符,并将奇偶校验位置成0。

字节的位8是奇偶位,将该字节与一个位1到位7为1、位8为0的字节进行与操作,可将该字节的奇偶校验位置成0。表达式ch&127正是将ch中每一位同127数字的对应位进行与操作,结果ch的位8被置成了0。在下面的例子中,假定ch接收到字符"A"并且奇偶位已经被置位。

一般来说,位的AND、OR和XOR操作通过对操作数运算,直接对结果变量的每一位分别处理。正是因为这一原因(还有其它一些原因),位操作通常不像关系和逻辑运算符那样用在条件语句中,我们可以用例子说明这一点:假定X=7,那么x& amp;&8为Ture(1),而x&8却为Flase(0)。
记住,关系和逻辑操作符结果不是0就是1。而相似的位操作通过相应处理,结果可为任意值。换言之,位操作可以有0或1以外的其它值,而逻辑运算符的计算结果总是0或1。
移位操作符>> 和<<将变量的各位按要求向或向左移动。右移语句通常形式是:
variable>>右移位数
左移语句是:
variable<< 左移位数
当某位从一端移出时,另一端移入0(某些计算机是送1,详细内容请查阅相应C编译程序用户手册)。

切记:移位不同于循环,从一端移出的位并不送回到另一端去,移去的位永远丢失了,同时在另一端补0。
移位操作可对外部设备(如D/A转换器)的输入和状态信息进行译码,移位操作还可用于整数的快速乘除运算。如表2-9所示(假定移位时补0),左移一位等效于乘2,而右移一位等效于除以2。

每左移一位乘2,注意x<<2后,原x的信息已经丢失了,因为一位已经从一端出,每右移一位相当于被2除,注意,乘后再除时,除操作并不带回乘法时已经丢掉的高位。反码操作符为~。~的作用是将特定变量的各位状态取反,即将所有的1位置成0,所有的0位置成1。位操作符经常用在加密程序中,例如,若想生成一个不可读磁盘文件时,可以在文件上做一些位操作。最简单的方法是用下述方法,通过1的反码运算,将每个字节的每一位取反。
原字节 00101100
第一次取反码 11010011
第二次取反码 00101100
注意,对同一行进行连续的两次求反,总是得到原来的数字,所以第一次求反表示了字节的编码,第二次求反进行译码又得到了原来的值。可以用下面的函数 encode()对字符进行编码。

5 ?操作符
C语言 提供了一个可以代替某些if-then-else语句的简便易用的操作符?。该操作符是三元的,其一般形式为:
EXP1 ? EXE2 : EXP3
EXP1,EXP2 和EXP3是表达式,注意冒号的用法和位置。
操作符“?”作用是这样的,在计算EXP1之后,如果数值为True,则计算EXP2,并将结果作为整个表达式的数值;如果EXP1的值为Flase,则计算EXP3,并以它的结果作为整个表达式的值,请看下例:
x=10;
y=x>9?100:200;
例中,赋给y的数值是100,如果x被赋给比9小的值,y的值将为200,若用if-else语句改写,有下面的等价程序:
x=10;

if(x>9)

   y=100;
else

  y=200;
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是同义词。
7关于优先级的小结
表2-10列出了C语言 所有操作符的优先级,其中包括将在本书后面讨论的某些操作符。注意,所有操作符(除一元操作符和?之外)都是左结合的。一元操作符(*,&和-)及操作符“?”则为右结合。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━
                    表达式                              ┃优先级
──────────────────────────────────╂────
  ()(小括号) [](数组下标) .(结构成员) ->(指针型结构成员)                      ┃ 最高
──────────────────────────────             ┃  ↑
 !(逻辑非) ~(位取反) -(负号) ++(加1) --(减1) &(变量地址)                  ┃  │
──────────────────────────────             ┃  │
   *(指针所指内容)  type(函数说明)  sizeof(长度计算)                            ┃  │
──────────────────────────────             ┃  │
     *(乘)     /(除)     %(取模)                                                                ┃  │
──────────────────────────────             ┃  │
     +(加)     -(减)                                                                                   ┃  │
──────────────────────────────             ┃  │
     <<(位左移)          >>(位右移)                                                           ┃  │
──────────────────────────────             ┃  │
     <(小于)   <=(小于等于)   >(大于)   >=(大于等于)                            ┃  │
──────────────────────────────             ┃  │
     ==(等于)       !=(不等于)                                                                  ┃  │
──────────────────────────────             ┃  │
     &(位与)                                                                                            ┃  │
──────────────────────────────            ┃  │
     ^(位异或)                                                                                         ┃  │
──────────────────────────────            ┃  │
     |(位或)                                                                                             ┃  │
──────────────────────────────            ┃  │
     &&(逻辑与)                                                                                      ┃  │
──────────────────────────────            ┃  │
     ||(逻辑或)                                                                                        ┃  │
──────────────────────────────            ┃  │
     ?:(?表达式)                                                                                      ┃  │
──────────────────────────────            ┃  │
     =    +=   -=(联合操作)                                                                     ┃  │
──────────────────────────────            ┃  │
     ,(逗号运算符)                                                                                   ┃ 最低
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

总的来说,大体上可以认为是算术运算符—关系运算符—位运算符—逻辑运算符。

彻底掌握 Javascript(三)运算符【专家辅导】

-
  • 1970年01月01日 08:00

4.Swift教程翻译系列——Swift基本运算符

Swift运算符介绍。包括数学运算符,比较运算符,三元运算符,范围运算符,逻辑运算符...
  • tsingheng
  • tsingheng
  • 2014-06-16 00:16:17
  • 1593

linux基础(十三)----linux编程基础----linux运算符

算术运算符 算术运算符可以让计算机对数据或包含数据的变量进行加、减,乘、除等工作。 加运算符(+) 两数相加,用加运算符(+),如下例所示: let a=30 let b=10 let s...
  • q383965374
  • q383965374
  • 2015-12-11 14:47:07
  • 1436

java基础之基本运算符

12.基本运算符 基本运算符: =:赋值(优先级最低):右边的值copy给左边的变量 +:加法 - :减法 13.数据类型是什么? 数据类型: 每一种数据类型相当于一个类型的桶。...
  • li_hong_zhen
  • li_hong_zhen
  • 2017-07-19 08:14:20
  • 142

Java基础(一)——关键字、变量、运算符

------- android培训、java培训、期待与您交流! ---------- 1,  dos命令行,课程中常见的命令: dir:列出当前目录下的文件以及文件夹 md:创建目录 rd:...
  • lee_tianya
  • lee_tianya
  • 2013-03-25 02:42:40
  • 1131

C/C++基础笔试题1.1.1(运算符十问)

运算符,你应该很熟悉吧?快来秒杀我的十个问题?!!!快!
  • u011044759
  • u011044759
  • 2014-07-14 16:12:01
  • 2150

Android前的Java基础:基本语句(四)

Android前的Java基础:基本语句(四)这次主要介绍一下 if语句,switch语句,for循环,while,do-while循环语句和break,continue之间的区别。1 . if 语句...
  • yichen97
  • yichen97
  • 2018-03-30 23:49:56
  • 8

Java语言基础(二): 运算符

在Java中,使用算术运算符 + 、- 、* 、/ 表示加、减、乘、除运算。当参与 / 运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法,整数的求余操作(有时称为取模)用 % 表示。比如说...
  • qian_ch
  • qian_ch
  • 2016-12-18 10:35:57
  • 717

[Android]基础面试题

前言我目前大四,正在找实习,做Android开发,下面是我在网上找的一些面试题,觉的比较好的文章或者试题都收集在下面。 本文参考了下面这几篇博客经典的Java基础面试题集锦Java 设计模式面试题j...
  • u014532717
  • u014532717
  • 2016-02-28 23:08:11
  • 1818

JavaScript——1(基本语法,类型,变量与运算符,控制流程,函数)

一.JavaScript的基本语法1,JavaScript是一种应用广泛的浏览器端Scripts。 2,JavaScript并没有规定每条程序语句的结尾一定要加上分号(;)。 3,函数名称的开头建...
  • Decorator2015
  • Decorator2015
  • 2016-05-12 16:22:49
  • 480
收藏助手
不良信息举报
您举报文章:基础之运算符
举报原因:
原因补充:

(最多只允许输入30个字)