运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,分类如下:
运算符 :能够帮助用户实现并完成某些运算操作的指令。
表达式:由操作数和运算符组成的序列,产生单一的值。
算术运算符包含2个单目运算符(正和负)和5个双目运算符(加、减、乘、除、取模)。具体符号和对应功能如下图表所示:
在表达式中使用算术运算符, 则该表达式称为算术表达式。
// #region << 版 本 注 释 >>
// // 创建者:GeekTribe
// // 时间:14:05
// //----------------------------------------------------------------*/
// #endregion
using 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 = 22
sub = 2
mul = 120
div = 1
fdiv = 1.25
fdiv_1 = 0.2083333
fdiv_2 = 4.8
mod = 2
*/
注意:
1、如果 +、-、*、/ 运算的两个数中有一个为浮点数, 为防止数据精度丢失,则结果应使用浮点数表示;
2、除法运算(/),默认为整除运算,其操作数中除数不能为0, 两整数相除时,其值必须取整,小数位忽略 不计; 若运算的两个数中有一个为浮点数,则结果为浮点数;
3、取模运算(%),运算符左右两侧操作数必须为整数,第二个操作数不能为0。
在数学中,经常需要比较两个数的大小。在C#语言中, 关系运算符的作用就是判断两个操作数的大小关系。具体符号和对应功能如下图表所示:
在表达式中使用关系运算符, 则该表达式称为关系表达式。关系运算符用于对两个表达式的值进行比较,返回一个真值或者假值。条件满足返回True,条件不满足返回False。真值表示指定的关系成立, 假值则表示指定的关系不成立。C#中分别用bool类型变量值True和False来表示真和假。
// #region << 版 本 注 释 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 极客部落
// // 版权所有。
// //
// // 文件名:Program.cs
// // 文件功能描述:
// //
// //
// // 创建者:GeekTribe
// // 时间:14:05
// //----------------------------------------------------------------*/
// #endregion
using 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
*/
C程序中常常遇到的赋值符号【=】就是赋值运算符, 其作用就是将一个数据赋给一个变量。
eg:
int iNum = 100;//变量iNum的值为100
在表达式中使用赋值运算符, 则该表达式称为赋值表达式。C#语言中有两种类型的赋值表达式:
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:
int g = 20;
但是下面这个就不是一个有效的语句,会生成编译时错误:
10 = 20;
逻辑运算符包含2个双目运算符(&&(逻辑与) 和 ||(逻辑或))和1个单目运算符(!(逻辑非))。具体符号和对应功能如下图表所示:
在表达式中使用逻辑运算符, 则该表达式称为逻辑表达式。
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
*/
位是计算机存储数据的最小单位。一个二进制位可以表示两种状态(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)
小技巧:快速计算一个负数的补码:找到原码从右往左第一位为1的和其后几位保持不变,其余的除了符号位全部取反
如何将一个十进制数转化成二进制数?
十进制数转成二进制主要有以下几种:
正数:除二取余,然后倒序排列,高位补零
eg:
(115)10=(01110011)2
负数:先是将对应的正整数转换成二进制后,高位符号位补1,对二进制取反(符号位不变),然后对结果再加 1
eg:
(-1)10 = (1000 0001)2 // 内存中的补码形式 (1111 1111)2
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
注意: 按位取反时, 包含符号位
左移(<<):每移一位, *2, 左移时, 符号位不动, 右边空出的位置用0填充
右移(>>):每移一位, /2,右移时,符号位不动, 左边空出的位置用与符号位相同的数值填充
在表达式中使用位运算符, 则该表达式称为位表达式。
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_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);
// 1111 1110 === 1 000 0010 = -2
Console.WriteLine("iNum_2 >> 2 = {0}\n", iNum_2 >> 2);
//1110 1100 === 1001 0100 = -20
Console.WriteLine("iNum_2 << 2 = {0}\n", iNum_2 << 2);
}
}
}
复合赋值运算符是C#语言中算术运算符与赋值运算符相结合而产生的一种运算符简写形式。具体符号和对应功能如下图表所示:
// #endregion
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);
}
}
C#语言中包含两个特殊运算符:自增运算符【++】和自减运算符【–】。自增或自减运算符对变量的操作分别是变量自增1与自减1。
自增运算符根据代码编写时相对于操作数放置的位置,可分为:前置自增与后置自增两种。
eg:
++iNum;//前置自增
fNum++;//后置自增
注意:
前置自增,先进行自增运算,然后再使用增后的新值参与其他运算。
后置自增,先使用变量当前的值参与其他运算,然后再进行自增运算。
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
}
}
}
自减运算符根据代码编写时相对于操作数放置的位置,可分为:前置自减与后置自减两种。
eg:
--dNum_1;//前置自减
dNum_2--;//后置自减
注意:
前置自减,先进行自减运算,然后再使用减后的新值参与其他运算。
后置自减,先使用变量当前的值参与其他运算,然后再进行自减运算。
C#语言中不同数据类型在计算机内存中占用不同大小的内存空间,为获取操作数在当前操作系统中所占的字节数(bytes)大小,可使用sizeof()运算符。C#中的sizeof只能用于获取值类型的字节数。https://msdn.microsoft.com/zh-cn/library/eahchzkf(VS.80).aspx
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
}
}
}
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
}
}
}