龙空技术网

第四章 运算符和表达式

农村猿 244

前言:

而今姐妹们对“表达式是一个值因此不能作为赋值目标”都比较注意,兄弟们都需要分析一些“表达式是一个值因此不能作为赋值目标”的相关知识。那么小编在网摘上收集了一些对于“表达式是一个值因此不能作为赋值目标””的相关资讯,希望咱们能喜欢,姐妹们一起来了解一下吧!

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,分类如下:

算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符§4.1 运算符和表达式概念

运算符:能够帮助用户实现并完成某些运算操作的指令。

表达式:由操作数和运算符组成的序列,产生单一的值。

§4.2 算术运算符与算术表达式§4.2.1 算术运算符

算术运算符包含2个单目运算符(正和负)和5个双目运算符(加、减、乘、除、取模)。具体符号和对应功能如下图表所示:

§4.2.2 算术表达式

在表达式中使用算术运算符, 则该表达式称为算术表达式。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            int iNum_1 = 12;            int iNum_2 = 10;​            float fNum_1 = 2.5f;            float fNum_2 = 2.0f;​            //加            int sum = iNum_1 + iNum_2;//sum = 22​            //减            int sub = iNum_1 - iNum_2;//sub = 2​            //乘            int mul = iNum_1 * iNum_2;//mul = 120​            //整除            int div = iNum_1 / iNum_2;//div = 1​            //浮点除            float fdiv = fNum_1 / fNum_2;//fdiv = 1.25​            float fdiv_1 = fNum_1 / iNum_1;//fdiv_1 = 0.208333            float fdiv_2 = iNum_1 / fNum_1;//fdiv_2 = 4.8​            //取余            int mod = iNum_1 % iNum_2;//mod = 2​            Console.WriteLine("sum = {0}\nsub = {1}\nmul = {2}\ndiv = {3}\nfdiv = {4}\nfdiv_1 = {5}\nfdiv_2 = {6}\nmod = {7}\n", sum, sub, mul, div, fdiv, fdiv_1, fdiv_2, mod);        }    }}/*输出结果*//*sum = 22sub = 2mul = 120div = 1fdiv = 1.25fdiv_1 = 0.2083333fdiv_2 = 4.8mod = 2*/

注意:

1、如果 +、-、*、/ 运算的两个数中有一个为浮点数, 为防止数据精度丢失,则结果应使用浮点数表示;

2、除法运算(/),默认为整除运算,其操作数中除数不能为0, 两整数相除时,其值必须取整,小数位忽略 不计; 若运算的两个数中有一个为浮点数,则结果为浮点数;

3、取模运算(%),运算符左右两侧操作数必须为整数,第二个操作数不能为0。

§4.3 关系运算符与关系表达式§4.3.1 关系运算符

在数学中,经常需要比较两个数的大小。在C#语言中, 关系运算符的作用就是判断两个操作数的大小关系。具体符号和对应功能如下图表所示:

§4.3.2 关系表达式

在表达式中使用关系运算符, 则该表达式称为关系表达式。关系运算符用于对两个表达式的值进行比较,返回一个真值或者假值。其中使用非0数表示真值(一般为数字1), 使用0表示价值。真值表示指定的关系成立, 假值则表示指定的关系不成立。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            int iNum_1 = 123;​            int iNum_2 = 456;​            Console.WriteLine("iNum_1 > iNum_2 = {0}\n", iNum_1 > iNum_2);            Console.WriteLine("iNum_1 >= iNum_2 = {0}\n", iNum_1 >= iNum_2);            Console.WriteLine("iNum_1 < iNum_2 = {0}\n", iNum_1 < iNum_2);            Console.WriteLine("iNum_1 <= iNum_2 = {0}\n", iNum_1 <= iNum_2);            Console.WriteLine("iNum_1 == iNum_2 = {0}\n", iNum_1 == iNum_2);            Console.WriteLine("iNum_1 != iNum_2 = {0}\n", iNum_1 != iNum_2);        }    }}/*输出结果*//*iNum_1 > iNum_2 = False​iNum_1 >= iNum_2 = False​iNum_1 < iNum_2 = True​iNum_1 <= iNum_2 = True​iNum_1 == iNum_2 = False​iNum_1 != iNum_2 = True*/
§4.4 赋值运算符与赋值表达式§4.4.1 赋值运算符

C程序中常常遇到的赋值符号【=】就是赋值运算符, 其作用就是将一个数据赋给一个变量。

eg:

int iNum = 100;//变量iNum的值为100
§4.4.2 赋值表达式

在表达式中使用赋值运算符, 则该表达式称为赋值表达式。C#语言中有两种类型的赋值表达式:

左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:

int g = 20;

但是下面这个就不是一个有效的语句,会生成编译时错误:

10 = 20;
§4.5 逻辑运算符与逻辑表达式

逻辑运算符包含2个双目运算符(&&(逻辑与) 和 ||(逻辑或))和1个单目运算符(!(逻辑非))。具体符号和对应功能如下图表所示:

§4.5.2 逻辑表达式

在表达式中使用逻辑运算符, 则该表达式称为逻辑表达式。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            bool iNum_1 = true;            bool iNum_2 = false;​            Console.WriteLine("iNum_1 && iNum2 = {0}\n", iNum_1 && iNum_2);​            Console.WriteLine("iNum_1 || iNum2 = {0}\n", iNum_1 || iNum_2);​            Console.WriteLine("!iNum_2 = {0}\n", !iNum_2);        }    }}​/*输出结果*//*iNum_1 && iNum2 = False​iNum_1 || iNum2 = True​!iNum_2 = True*/
§4.6 位运算符与位表达式

位是计算机存储数据的最小单位。一个二进制位可以表示两种状态(1和0),多个二进制位组合起来便可表示多种信息。那么, 什么是二进制呢?

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以【补码】的形式存储的。例如:

1    ->     0000 0001​2    ->     0000 0010​3    ->     0000 0011​-1   ->   1000 0001

注意:

二进制: 用 0 和 1 表示(8位), 最左边(最高位)是符号位:0表示正数, 1表示负数

正数:原码、反码、补码相同

负数:

原码:对应正数部分转换二进制后, 高位补1

反码:符号位除外,原码其余各位按位取反, 0 -> 1, 1 -> 0

补码:反码 + 1(原码取反 + 1),

如何将一个十进制数转化成二进制数?

十进制数转成二进制主要有以下几种:

正数:除二取余,然后倒序排列,高位补零

eg:

(115)10=(01110011)2

负数:先是将对应的正整数转换成二进制后,高位补1,对二进制取反,然后对结果再加 1

eg:

(-1)10 = (1000 0001)2

小数:对小数点以后的数乘以 2,有一个结果吧,取 结果的整数部分(不是 1 就是 0),然后再用小数部分 再乘以 2,再取结果的整数部分......以此类推,直到小数部分为 0 或者位数已经够了则停止运算。然 后 把获得的整数部分按先后次序排列,就构成了二进制小数部分的序列;如果小数的整数部分有大于 0 的 整数时该如何转换呢?如以上整数转换 成二进制,小数转换成二进制,然后拼接在一起即可)

eg:

(1.125)10 = (00000001.001)2
§4.6.1 位运算符

C#语言完全支持位运算,而且也能像汇编语言一样用来编写系统程序。具体符号和对应功能如下图表所示:

注意:

按位与(&):

1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0

按位或(|):

1 | 1 = 1

0 | 1= 1

1 | 0 = 1

0 | 0 = 0

按位异或(^):

1 | 1 = 0

0 | 1= 1

1 | 0 = 1

0 | 0 = 0

按位取反(~):

1 -> 0, 0 -> 1

公式: ~num = -(num + 1)

注意: 按位取反时, 包含符号位

左移(<<):每移一位, *2, 左移时, 符号位不动, 右边空出的位置用0填充

右移(>>):每移一位, /2,右移时,符号位不动, 左边空出的位置用与符号位相同的数值填充

§4.6.2 位表达式

在表达式中使用位运算符, 则该表达式称为位表达式。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            int iNum_1 = 3;            int iNum_2 = -5;​            Console.WriteLine("iNum_1 & iNum_2 = {0}\n", iNum_1 & iNum_2);            Console.WriteLine("iNum_1 | iNum_2 = {0}\n", iNum_1 | iNum_2);            Console.WriteLine("iNum_1 ^ iNum_2 = {0}\n", iNum_1 ^ iNum_2);            Console.WriteLine("~iNum_2 = {0}\n", ~iNum_2);            Console.WriteLine("iNum_1 >> 2 = {0}\n", iNum_1 >> 2);            Console.WriteLine("iNum_1 << 2 = {0}\n", iNum_1 << 2);        }    }}/*输出结果*//*iNum_1 & iNum_2 = 3​iNum_1 | iNum_2 = -5​iNum_1 ^ iNum_2 = -8​~iNum_2 = 4​iNum_1 >> 2 = 0​iNum_1 << 2 = 12*/
§4.7 复合赋值运算符§4.7.1 复合赋值运算符

复合赋值运算符是C#语言中算术运算符与赋值运算符相结合而产生的一种运算符简写形式。具体符号和对应功能如下图表所示:

§4.7.2 复合赋值表达式

在表达式中使用复合赋值运算符, 则该表达式称为复合赋值表达式。复合赋值表达式是通过先进行算术运算,然后再将运算结果赋值给变量自身。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            int iNum = 10;​            iNum += 5;            Console.WriteLine("+= iNum = {0}\n", iNum);​            iNum -= 5;            Console.WriteLine("-= iNum = {0}\n", iNum);​            iNum *= 5;            Console.WriteLine("*= iNum = {0}\n", iNum);​            iNum /= 5;            Console.WriteLine("\\= iNum = {0}\n", iNum);​            iNum %= 3;            Console.WriteLine("mod(iNum) = {0}\n", iNum);​            iNum <<= 2;            Console.WriteLine(" <<= iNum = {0}\n", iNum);​            iNum >>= 2;            Console.WriteLine(" >>= iNum = {0}\n", iNum);​            iNum &= 1;            Console.WriteLine("&= iNum = {0}\n", iNum);​            iNum |= 2;            Console.WriteLine("|= iNum = {0}\n", iNum);​            iNum ^= 3;            Console.WriteLine("^= iNum = {0}\n", iNum);        }    }}
§4.8 自增和自减运算符

C#语言中包含两个特殊运算符:自增运算符【++】和自减运算符【—】。自增或自减运算符对变量的操作分别是变量自增1与自减1。

§4.9.1 自增运算符

自增运算符根据代码编写时相对于操作数放置的位置,可分为:前置自增与后置自增两种。

eg:

++iNum;//前置自增​fNum++;//后置自增

注意:

前置自增,先进行自增运算,然后再使用增后的新值参与其他运算。

后置自增,先使用变量当前的值参与其他运算,然后再进行自增运算。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            int m, n = 0;​            m = 1;​            m++;//2​            Console.WriteLine("m = {0} , n = {1}\n", m, n);​            n = m++;//m:3 n:2            Console.WriteLine("m = {0} , n = {1}\n", m, n);​            n = ++m;//4, 4            Console.WriteLine("m = {0} , n = {1}\n", m, n);        }    }}
§4.9.2 自减运算符

自减运算符根据代码编写时相对于操作数放置的位置,可分为:前置自减与后置自减两种。

eg:

--dNum_1;//前置自减​dNum_2--;//后置自减

注意:

前置自减,先进行自减运算,然后再使用减后的新值参与其他运算。

后置自减,先使用变量当前的值参与其他运算,然后再进行自减运算。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            int m, n = 0;​            m = 1;​            m++;//2            Console.WriteLine("m = %d , n = %d\n", m, n);​            n = --m;            Console.WriteLine("m = {0} , n = {1}\n", m, n);​            n = m++;//m:3 n:2            Console.WriteLine("m = {0} , n = {1}\n", m, n);​            n = ++m;//4, 4            Console.WriteLine("m = {0} , n = {1}\n", m, n);​            m--;//4, 3            Console.WriteLine("m = {0} , n = {1}\n", m, n);        }    }}
§4.9 sizeof运算符

C#语言中不同数据类型在计算机内存中占用不同大小的内存空间,为获取操作数在当前操作系统中所占的字节数(bytes)大小,可使用sizoof()运算符。

格式:

sizeof(操作数);

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            /* sizeof 运算符的实例 */            Console.WriteLine("int 的大小是 {0}", sizeof(int));            Console.WriteLine("short 的大小是 {0}", sizeof(short));            Console.WriteLine("double 的大小是 {0}", sizeof(double));        }    }}
§4.10 条件运算符

C#语言中,条件运算符属于三目运算符,使用【?:】表示。通过条件运算符可对一个表达式的真假情况进行检验,然后根据检验结果返回另外两个表达式中的一个。

格式:

表达式1 ?表达式2:表达式3;

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            int iNum = 10;​            int result = (iNum > 20) ? (iNum + 10) : (iNum + 50);            Console.WriteLine("result = {0}\n", result); //60        }    }}
§4.11 is运算符

C#语言中,is运算符用于判断对象是否为某一类型。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            int iNum = 10;​            Console.WriteLine("iNum is int? {0}", iNum is int);        }    }}
§4.12 as运算符

C#语言中,as运算符用于强制类型转换,即使转换失败也不会抛出异常。

eg:

// #region << 版 本 注 释 >>// /*----------------------------------------------------------------// // Copyright (C) 2019 极客部落// // 版权所有。 // //// // 文件名:Program.cs// // 文件功能描述:// //// // // // 创建者:GeekTribe// // 时间:14:05// //----------------------------------------------------------------*/// #endregionusing System;using System.IO;​namespace MSN{    class MainClass    {        public static void Main(string[] args)        {            Object obj = new StringReader("Hello");​            StringReader r = obj as StringReader;        }    }}
§4.13 运算符优先级和结合型

标签: #表达式是一个值因此不能作为赋值目标