操作符概览
操作符也是运算符
操作符是用来操作数据的,被操作符操作的操作的数据叫做操作数
表格中越靠上的优先级越高
同一行的优先级一样
对于赋值操作符是从右边到左边,其他的是从左边到右边
操作符的本质
操作符的本质是函数(即算法)
操作符不能脱离与它关联的数据类型
{
int a = 5;
int b = 4;
int c = a / b;
Console.WriteLine(c); //输出为1
double x = 5;
double y = 4;
double z = x / y;
Console.WriteLine(z); //输出为1.25
}
可以理解为定义是什么类型就是什么类型不能改变
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace getmarray
{
class Program
{
static void Main(string[] args)
{
People p1 = new People();
People p2 = new People();
p1.name = "yuan";
p2.name = "yuan wife";
List jieguo = People.GetMarray(p1, p2);
foreach(var p in jieguo)
{
Console.WriteLine(p.name);
}
}
}
class People
{
public string name;
public static List GetMarray(People p1,People p2)
{
List people = new List();
people.Add(p1);
people.Add(p2);
for(int i = 0; i < 10; i++)
{
People child = new People();
child.name = p1.name + "&" + p2.name + "s child";
people.Add(child);
}
return people;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace getmarray
{
class Program
{
static void Main(string[] args)
{
People p1 = new People();
People p2 = new People();
p1.name = "yuan";
p2.name = "yuan wife";
List jieguo = p1+p2;
foreach(var p in jieguo)
{
Console.WriteLine(p.name);
}
}
}
class People
{
public string name;
public static List operator + (People p1,People p2)
{
List people = new List();
people.Add(p1);
people.Add(p2);
for(int i = 0; i < 10; i++)
{
People child = new People();
child.name = p1.name + "&" + p2.name + "s child";
people.Add(child);
}
return people;
}
}
}
两个结果一至
操作符的优先级
可以使用圆括号提高被括号括起来的表达式的优先级
圆括号可以嵌套
只有圆括号没有大括号,花括号,那些在c#中代表着其他的意思
同级操作符的运算顺序
除了带有赋值功能的操作符,同优先级操作符都是由左向右进行运算
带有赋值的则是由右往左
计算机语言中是没有结合律的
各类操作符的示例
x.y 成员访问操作符
可以访问方法和实列成员
x++先赋值再加
Type查看类型的内部结果
default获取类型的默认值
var 自动识别输入的数据类型
var x = 100 //var=int
var x = "agfaih" //var=string
new
通过创建一个类型的实列通过赋值将实例地址传给负责访问这个实例的变量
From myform = new Form();
还可以调用实例初始化
From myform = new Form(){Text = "Hello"};
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace diouhe
{
class Program
{
static void Main(string[] args)
{
Student stu1 = new Student();
stu1.student();
Csstudent stu2 = new Csstudent();
stu2.student();
}
}
class Student
{
public void student()
{
Console.WriteLine("I am student");
}
}
class Csstudent : Student //:相当于继承
{
}
}
如果将csstudent的方法重写
class Csstudent : Student //:相当于继承
{
new public void student()
{
Console.WriteLine("I am csstudent");
}
}
那么父类的student方法会被这个新的方法覆盖掉,输出结果也会改变
此刻的new就是一个修饰符,修饰这个方法,代表我要重写这个方法了
checked unchecked
检查一个值是否在内存中有溢出
class Program
{
static void Main(string[] args)
{
uint x = uint.MaxValue;
Console.WriteLine(x);
try
{
uint y = checked(x + 1);
Console.WriteLine(y);
}
catch (OverflowException)
{
Console.WriteLine("超出int的长度");
}
}
}
通过try-catch的使用如果没有错则继续执行,如果有错则输出catch里面的语句
unchecked指的是默认不管这个溢出,计算机中默认使用的是unchecked
sizeof只能获取结构体数据类型的长度
->指针访问操作符
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace zhizhen
{
class Program
{
static void Main(string[] args)
{
unsafe
{
Student stu;
stu.id = 1.0;
stu.scope = 99;
Student* pStu = &stu;
pStu->scope = 100;
Console.WriteLine(stu.scope);
pStu->id = 5.5;
Console.WriteLine(stu.id);
}
}
}
struct Student
{
public int scope;
public double id;
}
}
关于指针的注意事项
指针所访问的是存储空间,所以像上面string之类的应用类型指针是无法访问的,指针调用内部数据要用->是间接访问
~是对一个数在二进制的基础上按位取反
ToInt32()
表示将其他类型的数据转换为int类型
隐式类型装换
不丢失精度的转换
子类向父类的转换
当拿引用变量访问他所引用的实列成员的时候,只能访问到变量的类型所具有的成员
装箱
显式类型的转换
有可能丢失精度的转换,即cast
uint = 65536;
ushort y = (ushort)x;
若超出量程的数据,数据会选择后面数据会自动去掉超出部分的数据,返回剩下的值
拆箱
使用Conver类
Conver.想要转换为的数据类型();
ToString方法与各数据类型的Parse/TryParse方法
this.tb3.Text = result.ToString();
doubule x = double.Parse(this.tb1.Text);
Parse方法要输入正确的数字格式,否则会报错
这里的public static explicit operator Monkey(Stone stone)代表把石头类转换为猴子类
自定义类型转换操作符
乘法运算符
加法
减法
左移右移<< >>
对于左移,无论是正数还是负数都都是在最后一位添0
对于右移,如果是正数最高位应该补0,如果是负数最高位应该为一
左移可以理解为让这个数据乘2,右移就是让这个数据除2
所有的关系操作符的结果都是布尔类型的
&二进制进行对比相同位数都为真才是1,否则为0
|二进制进行对比相同位数都为假才是0,否则为1
^二进制进行对比,不相同的为1,相同的为0
式子1&&式子2
&&条件与,只有左右两边式子都是true的时候才是true
当式子1为假时,式子2就不会进行判断
式子1||式子2
||条件或,只要左右两百年有一个为true,那么整个就是true
当式子1为真时式子2就不会进行判断
Nullable
x = null; int? x = null;
两个语句相同
int y = x ?? 1;
这句话代表所有的null值变为1,null值合并操作符