三叶虫也能学会的C#零基础入门教程 02
https://b23.tv/STnGL5b 1、探索整数数学运算 正确 int a = 18; int b = 6; int c = a + b; Console.WriteLine(c); C#类型分为引用类型和值类型 引用类型存储的是数据的引用,包含用户定义类型和预定义类型 值类型存储的直接是数据,包含结构体、枚举、可空类型,而我们的bool和int都属于预定义结构体 C#当中的数值运算显然符合数学本身的定义 错误 int a = 18; int b = 0; int c = a / b; Console.WriteLine(c); 异常(exception)∶指的是程序运行当中不符合预期状况时,系统会对此进行报告并中断程序的运行;这类状况是系统定义或者由用户自定义的 抛出这些异常主要是为了确保程序能如期运行,并在出现这些异常时可以人为进行干预 捕获异常 int a = 18; int b = 0; int c = 0; try{ c = a/b; } catch(System.DivideByZeroException e){ Console.WriteLine("捕获到除数为零异常"); c = a; } Console.WriteLine(c); 2、探索整数运算 在C#当中进行四则运算的优先级与数学运算规则是一样的 int a = 5; int b = 4; int c = 2; int d = a + b * c; Console.WriteLine(d); 括号可以强制改变运算顺序 int a = 5; int b = 4; int c = 2; int d = (a + b) * c; Console.WriteLine(d); 整数有一个非常有趣的行为∶整数除法始终生成整数结果,即使预期结果有小数或分数部分也是如此 C#整数类型不同于数学上整数的另一点是∶int类型有最大限制和最小限制 int max = int.MaxValue; int min = int.MaxValue; Console.WriteLine($"The range of integer is {min} to {max}"); int what = max + 3; Console.WriteLine($"An example of overflow: {what}"); 整形包含有符号整形和无符号整形,有符号整形可以表达负数,而无符号整形只能表达0和正数 3、使用双精度类型 整数类型只能处理整数,我们想要处理非整数的时候,必须引入浮点数概念 double a = 5; double b = 4; double c = 2 double d =(a + b)/c; Console.WriteLine(d); 因为double类型是浮点数,所以使用整型的时候表现不出来了 双精度类型的数值范围远大于整数 double max = double.Maxvalue; double min = double.Minvalue; Console.WriteLine($"The range of double is {max} to {min}) E表示10的多少次方 4、使用十进制类型 它的范围确实要比我们的整型要大很多;与数学上的十进制数值一样,c#当中的双精度值可能有四舍五入误差 误差从哪来 是因为我们存储数据的空间是有限的,所以我们只能根据我们需要的精度来存储它 double third = 1.0 / 3.0; Console.WriteLine(third); 3.33333333 这里的位数就是双精度浮点数的精度 double third = 1 / 3; Console.WriteLine(third); 这样做结果变成0 因为这一行语句,是先进行右侧的运算,然后再把值赋给左侧,当数字写成1的时候,默认这是一个int,而加上.0以后,它就变成一个double;所以无论是1÷3.0还是1.0÷3 四则运算当中,只要有一个浮点数参与,其结果就会变成浮点数 double third = 1 / 3; 这个变量被定义为double类型,而右侧运算结果是int类型,所以在赋值过程当中,类型发生了转变 由int类型的0变成了double类型的0,这种转换我们叫做隐式类型转换 double third = 1 / 3; Console.WriteLine(third); 隐式类型转换的前提是目标类型比原类型的精度要高,只能低精度转到高精度,反过来则不行 double third = (int)(1.0 / 3); 这里之所以要打括号,是因为int转换符;它的优先级是高于乘除法的,所以我们要先运行这个除法就必须使用一个括号把它包起来,这样的转换就叫做显示类型转换 Console.WriteLine(third); 在一般.net的程序中,几乎都是使用double类型浮点数进行运算,因为误差会更小一些;unity呢因为性能考虑的是单精度浮点数,也就是float float f = 1.0f / 3f; 在数字后面加上f表示这个数不是双精度浮点数,而是单精度浮点数float float f = 1.0f / 3f; double d = 1.0 / 3.0; Console.WriteLine(f); Console.WriteLine(f); Console.WriteLine($"float的范围是{float.MinValue}到{float.MaxValue}"); Console.WriteLine($"double的范围是{double.MinValue}到{double.MaxValue}"); 可以看到单精度浮点数float,它的精度比起双精度要少一半,而且它的范围也比双精度浮点数要小很多;当然,存储空间较小,它的性能比双精度更高一些 整数和浮点数,不管是双精度还是单精度,它们都属于基础数字类型 十进制,也叫decimal:类型范围较小,但进度比double高 decimal min = decimal.MinValue; decimal max = decimal.MaxValue; Console.WriteLine($"The range of the decimal type is {min} to {max}"); decimal c = 1.0M; decimal d = 3.0M; Console.WriteLine(c / d); decimal的数也需要在后面加上一个大写的M作为后缀,可见它的精度要比双精度要高很多 十进制类型不是基础数字类型,其性能较低,更多的还是会使用double和float double r = 2.5; double area = Math.PI * r * r; Console.WriteLint($"area is {area}");