前言
在前面的几篇文章中,我们主要介绍了C#的几种数据类型,那么仅仅有了数据对于我们来说还是不够的,否则计算机就不叫计算机了,改叫记录器了,所以,我们还要对这些数据进行各种各样的计算,而计算自然离不开各种不同的运算符了,所以在这篇文章中,我们主要来介绍最基础的算术运算符以及赋值运算符。
1 算术运算符
在具体解释各类运算符之前,我们需要先搞明白什么叫运算符,从定义来说:运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。 说的简单一点,就像我们学数学时写的算式一样,我们需要用各种符号来表示加减乘除等运算,那么这里的加号(+)减号(-)等符号就是所谓的运算符了,只是数学中我们写在纸上的算式是给人看的,但在编程中,我们写的运算符是在告诉电脑应该做什么操作而已。
在C#中,算术运算符一共有7个,分别为:
运算符 |
名称 |
描述 |
+ |
加法运算符 |
将两数相加获得相加的和 |
- |
减法运算符 |
将两数相减获得差值 |
* |
乘法运算符 |
将两数相乘获得积 |
/ |
除法运算符 |
将两数相除获得商 |
% |
取余运算符 |
将两数相除后取得余数 |
++ |
自增运算符 |
数值加1 |
– |
自减运算符 |
数值减1 |
1.1 基本运算符
在这7个运算符中,我们先来讨论前五个运算符,加减乘除和取余,这五个运算符应该看起来非常眼熟,就如同我们数学中学的一样,这五个运算符都是在对运算符左右两边的数值进行运算,但在程序中,由于我们将数据分为了许多不同的数据类型,所以还是有一些要注意的地方的,其中最主要的一点就是:
这一个要求在C#中尤为重要,因为C#有着大量各式各样的数据类型,所以在做运算时,哪些数据类型能够进行运算,哪些不行是需要格外注意的问题。
(1)数值类型和数值类型
数值类型之间的运算是最基本的,无论是整数和整数之间运算还是浮点数之间的运算,又或者整数和浮点数之间运算,都是可以的,运算符两侧的操作数也既可以是对应类型的变量,也可以是具体的数值,如:
int intValue = 5;
float floatValue = 1.2f;
Console.WriteLine(1 + 2);//结果为:3
Console.WriteLine(intValue - 2);//结果为:3
Console.WriteLine(floatValue * 2);//结果为:2.4
Console.WriteLine(intValue - floatValue);//结果为:3.8
Console.WriteLine(5 % 2);//结果为:1
以上代码片段中的五个运算都是正确的,可以正常的输出计算结果。
另外,在C#中,算术运算符的运算优先级和数学中的运算优先级一致,在一个较长的表达式中,会优先计算乘、除、取余三类运算,再算加减运算,当然和数学中一致,有括号也是先算括号内。
Console.WriteLine(5 + 2 * 6 + 5 % 2 );//结果为:18
Console.WriteLine(5 + 2 * ( 6 + 5 ) % 2 );//结果为:5
(2)字符类型运算
在之前文章中我们介绍过,计算机存储字符类型是使用的编码表,将字符根据编码表转变为一个数值进行存储,所以说字符类型是可以转换为数值类型的,那么字符类型可以参与算术运算么?如在ASCII码表中,字符‘a’对应的编码值为97.
Console.WriteLine(5 + 'a');//结果为:102
Console.WriteLine(5 - 'a');//结果为:-92
Console.WriteLine(2 * 'a');//结果为:194
Console.WriteLine(97 / 'a');//结果为:1
Console.WriteLine(98 % 'a');//结果为:1
Console.WriteLine('a' + 'a');//结果为:194
通过以上代码及运算结果,我们可以发现,字符类型也可以作为算术运算符的操作数参与算术运算,但运算中并非以字符本身,而是根据编码表转换为了数值类型参与了具体的运算,所以并没有违反我们在之前给出的要求。
(3)字符串运算
与字符类型不同,在之前文章中我们说过字符串可以看做是一堆字符类型的集合,所以在运算时无法轻易地转换为数值类型进行运算,但并非所有的运算符都对字符串无效,在之前我们也提到过一个特殊的运算符,那就是“+”,这个运算符可以应用于字符串,但应用于字符串时,它就不再叫做“加法运算符”了,而是变成了“字符串拼接符”,他的作用是将左右两边都转换为字符串,并将两个字符串进行拼接,如:
Console.WriteLine("hello" + " world");//输出结果为:hello world
Console.WriteLine("衬衫的价格是" + 9 + "磅" + 15 + "便士");//输出结果为:衬衫的价格是9磅15便士
在上面的两行代码中,我们可以看到,当“+”运算符应用于字符串或字符串和其它类型之间时,将不再作为加法,而是拼接,即使一边为字符串,另一边为数值,也是将数值变成字符串进行拼接。
(4)布尔类型运算
较为特殊的是,之前讲解数据类型时我们有提到,布尔类型在C#中无法转变为其它的任何类型,也无法用1代表true,0代表false,因此,布尔类型无法转变为数值类型,也就无法被应用于任何算术运算。
特别注意点:
1、除法运算符右侧,也就是除数不能为0;
2、两个整数相除得到的结果也会是一个整数,小数部分会被忽略,如不想小数被忽略,需要把除号两端的操作数强转为浮点数类型;
3、取余操作符右侧操作数不能为0;
4、取余操作的结果如果不是零的话,则结果的正负号和左侧操作数正负号一致,与右侧操作数正负号无关。
1.2 自增自减运算符
自增自减运算符只需要一个操作数,他的作用是将操作数转变为数值后,在数值上直接加上或减去1,如:
int intValue = 1;
intValue++;//等价于intValue = intValue + 1
Console.WriteLine(intValue);//输出结果为:2
intValue--;//等价于intValue = intValue - 1
Console.WriteLine(intValue);//输出结果为:1
如以上代码显示,一定要注意的是,自增自减运算符在运算完后会修改变量本身的值,并非是一次性的,所以在使用时一定要注意,这个值是否需要修改或修改后是否会存在问题。
自增和自减运算符放在操作数前和放在操作数后都可以,但放在之前会先进行自增或自减操作,再返回变量值,放在之后会先返回操作数,再进行自增或自减操作。
int num = 1;
int num1 = num++;
Console.WriteLine(num1);//输出的结果为:1
Console.WriteLine(num);//输出的结果为:2
int num2 = 1;
int num3 = ++num2;
Console.WriteLine(num3);//输出的结果为:2
Console.WriteLine(num2);//输出的结果为:2
如上文所说,自增和自减运算符无论放在操作数前还是后都是可以运算的,且都是在变量本身的基础上加上1或减去1,唯独运算顺序不同。
如代码中的上半段,使用了num++,将运算符放在了操作数后,因此在一开始会先将num本身的数值,也就是1通过等号赋值给num1变量,再进行自增,因此输出结果中,num1 = 1,而num = 2.
下半段中则使用了++num,将运算符放在了前面,所以在返回num数值之前,先进行了num2的自增操作,此时的num2数值已经等于2了,再通过等号赋值给前面的num3变量,所以这里的num2和num3都等于2。
需要注意,自增自减运算符只能应用于变量,不能应用于常量,也就是说定义一个变量进行自增是正确的,但如果直接写“2++”这样的代码,将会直接报错
3 赋值运算符
赋值运算符顾名思义,是用来给变量赋值的,而最常见的赋值运算符就是“=”。
int num = 1;//定义一个叫做num的变量,并赋值为1
int num1 = num;//定义一个叫做num1的变量,并将num的值赋值给这个变量
赋值运算符还可以与其他运算符结合使用,如:
int num1 = 1;
int num2 = 2;
//等同于num2 = num2 + num1
num2 += num1;
//等同于num2 = num2 - num1
num2 -= num1;
//等同于num2 = num2 * num1
num2 *= num1;
//等同于num2 = num2 / num1
num2 /= num1;
//等同于num2 = num2 % num1
num2 %= num1;
除了像上面一样应用于两个变量外,也可以应用于一个变量一个常数的情况。
int num = 1;
//等同于num = num + 2
num += 2;
这样的复合运算符,相当于先进行了运算,再将运算的结果返回给了自己,也就是说这种运算符的使用也会修改变量本身的值,因此使用时也需要注意变量值的改变。
总结
以上就是今天要介绍的内容,在这篇文章中,主要介绍了常见的几种算术运算符以及赋值运算符的使用方法及特点,其中自增自减以及赋值运算符和算术运算符的复合使用都会修改变量本身值,在使用时需要多加理解和练习。