8.1.2.1 基本运算符

M语言提供了大量的运算符,包括算术运算符、逻辑运算符、赋值运算符、关系运算符等,在程序中我们经常遇到一些复合的表达式,要理解程序中的一些复合表达式的具体含义,就必须先了解优先级、结合性以及操作数(操作数可以是常量、变量或函数等)的求值顺序,优先级规定复合表达式中操作数结合的方式,而结合性则决定同一个优先级的操作数如何结合。

通常,操作数的求值顺序不会影响表达式的结果,但是,如果操作符的两个操作数都与同一个变量相关,而且其中一个操作数改变了该类型的值,则将会产生严重的错误将很难发现。下面,我们将一一介绍每个操作符。

u  算术运算符

M语言提供了6个算术运算符:-()+-*/%。其中包括单目运算符和双目运算符。

Ø  -()是单目运算符:用于对操作数取反操作,其功能是将操作数变成原值的相反数。

例如:

int a,b;

a = -3;  //3取反,得到结果放到a存储单元中

b = -a;  //a存储单元的值的相反数放到b的存储单元中,a的值没有发生改变

Ø  M语言中含有以下双目算术运算符:

+          加法运算符

-          减法运算符

*          乘法运算符

/          除法运算符

%          求模运算符(也称为求余运算符)

+-*运算符的功能分别与数学中的加法、减法和乘法的功能相同,分别计算两个操作数的和、差、积(当操作数有一个整型数和一个实型数时,为了保证精度,编译器会自动把整型数强制转换成实型数进行运算)。

对于除法运算符“/”,若两边的操作数均为整型数时,则作整除运算,即只取运算结果的整数部分,去掉小树部分(如果操作数时浮点数,则类似于数学中的除法运算)。例如:

int a;

a = 8 + 9;  //此时a存储单元的值是17

a = a /8;  //此时a存储单元的值是2

对于求模运算符“%”,其两边的操作数必须是先转换成整型数,其计算结果是两数相除后所得到的余数。例如:

int a;

a = 11%5;  //a存储单元内部的值为1

a = 9.3%4;  //a存储单元内部的值为1

a = 9%3.9;  //a存储单元内部的值为0

算术运算符的优先级为:单目运算符(-)高于双目运算符(+-*/%)。例如:

int a,b,c;

a = 5;

b = 3;

c = -8*-8 – 8;  //c存储单元内部的值为56

M语言中,与算术运算符有关的一个问题是计算过程中溢出(超出了对应类型数据的表示范围)处理问题。在做除法运算时,若除数为0或实数运算的结果溢出时,则系统会终止程序的执行。而两个整数做加法、减法或乘法运算时,产生整数溢出并不认为是一个错误,但这时计算的结果已不正确了。

u  关系运算符

关系运算符完成两个操作数的比较运算。M语言中提供了6个关系运算符:<(小于)<=(小于等于)>(大于)>=(大于等于)==(等于)!=(不等于)。他们都是双目运算符,运算的结果为一整数,当关系成立时,其运算结果为整数1(逻辑真);当关系不成立时,其运算结果为整数0(逻辑假)。关系运算的结果可作为一个整数参与表达式的运算。例如:

3>5       //3不大于5,结果为0

3!=5      //3不等于5,结果为1

关系运算的优先级在同一个优先级,运算顺序是由左到右到右依次运算。

u  逻辑运算符

逻辑运算符把各个运算的变量(或常量)连接起来组成一个逻辑表达式,包括了逻辑非(!)、逻辑与(&&)、逻辑或(||)三种逻辑运算符。其中,逻辑非是单目运算符,其只要求有一个运算量。逻辑与和逻辑或都是双目运算符,要求有两个运算量。当操作数(变量)为真时,逻辑非运算的结果则为假。对应逻辑与运算符,只有当两个操作数都为真时,逻辑与运算的结果则为真。对于逻辑或操作符只要有一个操作数为真,则逻辑或运算的结果为真。

例如:

(2>6)         //结果为1

7>3 && 10>6     //结果为1

5>2 || 4>8       //结果为1

逻辑运算符的运算优先级:取反!高于&&||&&||的优先级是一样的。

u  位运算符

我们知道,8位构成一个字节,两个字节构成一个字。无论在什么情况下,数据总是用01的组合起来存储的。有时按位来操作数据是必要的,程序员可能希望通过改变存储在位、字节或字中的01来改变透明的值。

所谓位运算是指二进制位的运算,在实际编写程序的过程中,经常涉及二进制位的问题。例如,将以寄存单元中的二进制位由01或由10。位运算符的操作数必须为intbyte型变量(如果是浮点型数,系统会报错)M语言中提供了按位与(&)、按位或(|)、按位异或(^)和位取反运算符(~),他们统称为按位逻辑运算符。

取反运算符“~”是一元运算符,它是对其操作数进行二进制逐位取反运算,若二进制位为0,则取反后为1;若二进制位为1,则取反后为0

按位逻辑与“&”是二元运算符,参与运算的两个操作数按二进制位进行“与”运算,若两个数相应的二进制位都为1,则该位的结果值为1,否则为0。即:

0&0 = 00&1 = 01&0 = 11&1 = 1

按位逻辑或“|”也是二元运算符,参与运算的两个操作数按二进制位进行“或”运算,若两个数相应的二进制位有一个为1,则该位的结果值为1,否则为0。即:

0|0 = 00|1 = 11|0 = 11|1 = 1

按位异或“^”也称XOR运算符,其运算规则是:将两个操作数逐位进行运算,若对应位不同,则该位结果为1,否则为0。即:

0^0 = 0;0^1 = 1;1^0 = 1;1^1 = 0;

例如:

110对应的二进制数为1010,其按位取反为:

                       1010

                     (~)0101

即为十进制的5。不要误认为~10的值是 -10

25&8的结果并不等于13,而应该进行按位与运算:

                        0101

                (&)     1000

          ____________________________

                        0000

因此,5 & 8的结果是0

3)将十进制的30与十进制的15进行按位或运算:

                        00111110

                (|)      00001111

          ____________________________

                        00111111

因此,30 | 15的结果是63

4)将十进制的17和十进制的12进行“异或”运算:

                        00010001

                (^)      00001100

          ____________________________

                        00011101

因此,17^12的结果是29

 温馨提示:几乎每一个初学者在开始都会把逻辑运算符和位运算符相互混淆,如逻辑与(&&)运算符和按位与(&)运算符。