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位构成一个字节,两个字节构成一个字。无论在什么情况下,数据总是用0和1的组合起来存储的。有时按位来操作数据是必要的,程序员可能希望通过改变存储在位、字节或字中的0和1来改变透明的值。
所谓位运算是指二进制位的运算,在实际编写程序的过程中,经常涉及二进制位的问题。例如,将以寄存单元中的二进制位由0变1或由1变0。位运算符的操作数必须为int或byte型变量(如果是浮点型数,系统会报错)。M语言中提供了按位与(&)、按位或(|)、按位异或(^)和位取反运算符(~),他们统称为按位逻辑运算符。
取反运算符“~”是一元运算符,它是对其操作数进行二进制逐位取反运算,若二进制位为0,则取反后为1;若二进制位为1,则取反后为0。
按位逻辑与“&”是二元运算符,参与运算的两个操作数按二进制位进行“与”运算,若两个数相应的二进制位都为1,则该位的结果值为1,否则为0。即:
0&0 = 0;0&1 = 0;1&0 = 1;1&1 = 1;
按位逻辑或“|”也是二元运算符,参与运算的两个操作数按二进制位进行“或”运算,若两个数相应的二进制位有一个为1,则该位的结果值为1,否则为0。即:
0|0 = 0;0|1 = 1;1|0 = 1;1|1 = 1;
按位异或“^”也称XOR运算符,其运算规则是:将两个操作数逐位进行运算,若对应位不同,则该位结果为1,否则为0。即:
0^0 = 0;0^1 = 1;1^0 = 1;1^1 = 0;
例如:
(1)10对应的二进制数为1010,其按位取反为:
1010
(~)0101
即为十进制的5。不要误认为~10的值是 -10。
(2)5&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。
温馨提示:几乎每一个初学者在开始都会把逻辑运算符和位运算符相互混淆,如逻辑与(&&)运算符和按位与(&)运算符。