§4.5 逻辑运算符与逻辑表达式
逻辑运算符包含2个双目运算符(&&(逻辑与) 和 ||(逻辑或))和1个单目运算符(!(逻辑非))。具体符号和对应功能如下图表所示:
§4.5.2 逻辑表达式
在表达式中使用逻辑运算符, 则该表达式称为逻辑表达式。
eg:
using 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 // 内存中的补码形式 (1111 1111)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
按位异或(^):相同为0不同为1
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:
using 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:
using 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:
using System; namespace MSN { class MainClass { public static void Main(string[] args) { int m, n = 0; m = 1; m++; Console.WriteLine("m = {0} , n = {1}\n", m, n); //m = 2, n = 0 n = m++; Console.WriteLine("m = {0} , n = {1}\n", m, n); //m = 3, n = 2 n = ++m; Console.WriteLine("m = {0} , n = {1}\n", m, n); //m = 4, n = 4 } } }
§4.9.2 自减运算符
自减运算符根据代码编写时相对于操作数放置的位置,可分为:前置自减与后置自减两种。
eg:
--dNum_1;//前置自减 dNum_2--;//后置自减
注意:
前置自减,先进行自减运算,然后再使用减后的新值参与其他运算。
后置自减,先使用变量当前的值参与其他运算,然后再进行自减运算。
eg:
using System; namespace MSN { class MainClass { public static void Main(string[] args) { int m, n = 0; m = 1; m++; Console.WriteLine("m = {0} , n = {1}\n", m, n);//m = 2, n = 0 n = --m; Console.WriteLine("m = {0} , n = {1}\n", m, n);//m = 1, n = 1 n = m++; Console.WriteLine("m = {0} , n = {1}\n", m, n);//m = 2, n = 1 n = ++m; Console.WriteLine("m = {0} , n = {1}\n", m, n);//m = 3, n = 3 m--; Console.WriteLine("m = {0} , n = {1}\n", m, n);//m = 2, n = 3 } } }
§4.9 sizeof运算符
C#语言中不同数据类型在计算机内存中占用不同大小的内存空间,为获取操作数在当前操作系统中所占的字节数(bytes)大小,可使用sizeof()运算符。C#中的sizeof只能用于获取值类型的字节数。https://msdn.microsoft.com/zh-cn/library/eahchzkf(VS.80).aspx
格式:
sizeof(操作数);
eg:
using System; namespace MSN { class MainClass { public static void Main(string[] args) { /* sizeof 运算符的实例 */ Console.WriteLine("int 的大小是 {0}", sizeof(int)); //4 Console.WriteLine("short 的大小是 {0}", sizeof(short)); //2 Console.WriteLine("double 的大小是 {0}", sizeof(double)); //8 } } }
§4.10 条件运算符
C#语言中,条件运算符属于三目运算符,使用【 ? : 】表示。通过条件运算符可对一个表达式的真假情况进行检验,然后根据检验结果返回另外两个表达式中的一个。
格式:
表达式1 ? 表达式2 : 表达式3 ;
eg:
using 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:
using System; namespace MSN { class MainClass { public static void Main(string[] args) { int iNum = 10; Console.WriteLine("iNum is int? {0}", iNum is double); //iNum is int? False Console.WriteLine("iNum is int? {0}", iNum is int); //iNum is int? True Console.WriteLine("iNum is int? {0}", iNum is Object); //iNum is int? True Console.WriteLine("iNum is int? {0}", iNum is ValueType); //iNum is int? True } } }
§4.12 as运算符
C#语言中,as运算符用于强制类型转换,即使转换失败也不会抛出异常。 as不能用于值类型,这是因为值类型不能为null
eg:
using System; namespace MSN { class MainClass { public static void Main(string[] args) { string str1 = "Hello";//Hello Object obj = str1 as object; Console.WriteLine("{0}", obj.ToString()); //Hello string str2 = obj as string; Console.WriteLine("{0}", str2); //Hello } } }
§4.13 typeof运算符
C#语言中,typeof 运算符是用于返回 class 的类型,也可以用于开放式泛型类型。具有多个类型参数的类型必须在规范中具有适当数量的逗号。
eg:
using System; namespace MSN { class MainClass { public static void Main(string[] args) { Type a = typeof(string); string aa = new string("Hello World"); Type b = aa.GetType(); Console.WriteLine("{0} {1}", a, b);//System.String System.String } } }
注意:typeof 和 GetType() 有相同的作用,区别在于typeof 的参数是类型,GetType() 的参数是类型的变量
§4.14 运算符优先级和结合型