• C#学习笔记之.C基础中比较容易被忽略的细节(一)


    前言:刚开始学习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会出现运算误差。

    这些知识点可能在我们的实际工作中并不常见,但是确实也是一些不得不知道的基础知识。

  • 相关阅读:
    ubuntu svn
    node install
    Hello World
    复合过去式
    Fréquence
    HTTP是什么?
    Photon——Requirements 需求
    Ext.Net 实现文件下载
    我的绝世好剑——如何开始创建.NET程序
    Photon——Introduction 介绍
  • 原文地址:https://www.cnblogs.com/xwzLoveCshap/p/11417974.html
Copyright © 2020-2023  润新知