前言:刚开始学习C#的我学习的并不特别仔细,因为学校教的是Java,基本上所有基础都是一掠而过,最惨的是Java还学的不认真。当年老师跟我们说注重实用主义,,我们不是学究,不需要寻根问底,大多数知识会用就行了,这样才能快速提高自己编写代码的能力。
后来我在编程的时候遇到不少有趣的现象,就重新学习了一边C#基础。视频的老师讲的很好很仔细,我学到很多之前没学过的东西。下面我将分享一下我遇到容易被忽略的细节,你是否也遇到过?
例题1,byte b=1;
b+=3;
b=b+3;
上面b+=3和b=b+3我们学过是同一个意思。但是如果把这段代码放到VS上,我们会发现b+=3没有问题,b=b+3却出现了错误。这时会感到很奇怪,这两不是同一个意思吗?为什么一个可以,另一个不可以?
我们从VS错误提示可以容易获知b=b+3缺乏一个显示转换(强制转换),我们把它改成b=(byte)(b+3)就没问题了。但这又引出了下一个问题,为什么b+=3不用显示转换?
这我们就涉及到了第一个容易被忽略的知识点:快捷运算符,不做自动类型转换。
使用快捷运算符依然会出现数据超出类型的取值范围,数据二进制截断的问题,但是它就是不会给你提示需要转换。
例题2,int n1=1,n2=2;
bool re1=n1>n2 && n1++>2;
Console.WriteLine(n1);
bool re2=n1<n2 || n2++<1;
Console.WriteLine(n2);
这时候问 n1 和 n2 输出多少?
这时我们可以看到 n1=1;n2=2. 这时我们会问,这为什么啊?不是n1++,n2++后n1=2,n2=3吗?
这时我们来到了第二个容易被忽略的知识点:短路逻辑
&&逻辑与 : 条件1 && 条件2 ,不管哪个条件为假,结果都为假。程序运算都是从左往右的,先运算条件1:n1>n2,为false。一假具假,已经可以判定结果false.所以这里后面的条件二不执行判断。
|| 逻辑或 : 条件1 && 条件2 ,不管哪个条件为真,结果都为真。先运算条件1:n1<n2,为ture。一真具真,已经可以判定结果ture.同样后面的条件二不执行判断。
所以 n1++,n2++都没有执行 ,自然n1,n2的值不会发生改变。
例题3,float f1=3.0f;
float f2=2.9f;
bool b1=f1-f2==0.1f;
Console.writeLine(b1);
问:输出的布尔型b1是什么?
揭晓答案:
答案是false, 这时有疑问了,3.0-2.9=0.1==0.1 这没问题啊 0.1==0.1这不是ture 吗?
这时我们得找原因,b1=false,那难道f1-f2不等于0.1?这时我们可以新增一个变量:float f3=f1-f2;打个断点检查下:
这3.0f-2.9f居然真的不是0.1f,这是为什么?
这时我们来到了第三个容易被忽略的知识点:二进制无法准确表示1/10,就像十进制中无法准确表示1/3一样。所以3.0f-2.9f会出现运算误差。
这些知识点可能在我们的实际工作中并不常见,但是确实也是一些不得不知道的基础知识。