zoukankan      html  css  js  c++  java
  • 小猪猪逆袭成博士之C++基础篇(一)数据精度、强制类型转换、变量命名规则

    小猪猪逆袭成博士之C++基础篇(一)

    关键词:
    数据精度、强制类型转换、变量命名规则

    综述:

    1、大多数编程语言通过两种方式来进一步补充其特征:一是赋予程序员自定义数据类型的权利(C++中的类);二是讲一些有用的功能封装成库函数提供给程序员使用(C++提供的函数和标准库)。

    2、C++是一种静态数据类型语言,他的类型检查发生在编译时,而另外一些语言例如Python是在运行时检查数据类型的。

     

    基础篇主要分为六个部分,通过这六个部分我们将了解C++的基本知识。通过这些基本语法知识就足够在OJ平台上AC一个小程序啦!PS:本文只可作为你茶余饭后小点心,如果你一点点基础知识都没有还是先好好听老师上课或者看看书吧~

     

    本章主要简述的是C++的内置类型,通过这些内置类型可以初步了解C++是如何支持更加复杂的数据类型的。

     

    一、基本的内置类型

    基本内置类型包括我们熟悉的boolcharshort, int, long, float,double,还有其他的什么宽字节啊,长整形啊,64位长整形什么的。当然了,你有一点点编程语言的知识都会觉得简直SO EASY啊,还有什么好说的呢。其实还是有很多需要阐述的事情:

     

    第一,各种类型的位数

    也许你会背的很熟,char8位,short16位,float32位等等,但是需要值得注意的是int型,在不同的机器上面的位数是浮动的,可能是16位也有可能是32位。

    至于浮点数的精度问题,简单的就是如何选用floatdouble的这个问题来说float是有7个有效数字,double是有16位有效数字。在你做少量的运算的时候可以不太考虑这些精度问题,但是当你做大量数据运算,例如我们做大量的图片像素计算并且在算法用有很多迭代求导什么的,精度的区别的积累会出现很大差距。而且不用编译器是不同的。通常你做算法出现了和理论不同的结果,可以查一查是不是精度的问题。

    在此,我就建议最好还是尽量选择用double类型的。原因有2,第一,double 精度高,第二,double不一定慢。

     

    第二,强制类型转换

    在很多运算中会做强制类型转换,通常会碰到这样一些问题:

    1、整数和浮点数之间的转换:

    整数转成浮点数就很容易理解了,就是整数后面加上0,比如1,变成浮点数就会是1.0这样,但是你要是长整形就不是这么回事了。学过《组成原理》的应该就知道浮点数的存储方法,是数字加上小数点的位置。因此浮点数都是有一个范围的,当你的整数太大了还是会溢出的,很多竞赛题都是这么坑人的。自己在编程的时候需要注意。

    浮点数转换成整数,浮点数转换成整数的时候不要想象成近似,它是实实在在的剪掉了,我们写小段代码就可以知道了:

         double a=1.234;

     

    int b=a;

     

    cout<<"a= "<<a<<endl;

    cout<<"b= "<<b<<endl;

     

    a=1.789;

    b=a;

     

    cout<<"a= "<<a<<endl;

    cout<<"b= "<<b<<endl;

    结果是这样的

     

    2、有符号和无符号类型转换。

    还是从《组成原理》里面数字存储的角度来讲,有符号类型和无符号类型存储方式是两回事,有符号的数存储的时候是专门有个符号位的,无符号就是没有了。所以并不是 char -3变成unsigned char 以后会成为3,实际结果应该是该值对256取模的余数。因此,写程序的时候有符号就是有符号,无符号就是无符号千万不要混用。另外,无符号的数字相减的时候也要注意,千万不能剪成负数了,这样值就不对啦。很多编程的时候总是有问题可能是这个引起的。切记,切记!

     

    总之选择数据类型是一件非常重要的事情,通常需要考虑到精度、存储大小还有符号问题。特别是当你在做对内存有严格控制的程序的时候。

     

    二、变量的声明和命名规则

    一般的,老师都会告诉你全局变量,局部变量的作用范围什么的。在C++中一个变量只能定义一次,但是会有作用域的区别。简单的来说我们看一个简单的程序。

     

     

     

    基本上就是这样了,最里面的作用域只在里面用。括号完了以后就恢复要原先的。可以看到我们再第15行定义了一个i=10018行的for语句运行完i应该是9,但是括号结束了,那个等于9i就没有用了,所以又成了100

     

    三、指针和引用

    在学习C语言的时候,刚刚学到指针的时候一般都是弄不懂的,因为这个东西太虚拟了。最先开始别人问我指针到底是个什么玩意的时候,我只能按照书上写的那一通说一遍,你要是还是不懂,我再甩你一句话。靠经验,用常了就知道了。

    那么还是根据《组成原理》或者《操作系统》这种讲述了计算机存储原理的书籍后,大概可以发现,指针也可以看成是一个变量,和int差不多。但是int这种放的是数据,指针放的是地址。计算机在做指针的时候,先读指针里面的数据就是地址了,然后再根据这个地址找到在这个地址的数据。所以了,常见的用法,声明指针int *p,*q,前面带了星号,当我们做p=q的时候,实际上是把q指向的地址给了p,我们做*p=*q的时候是把q地址指向的数据值给了p地址指向的数据值。简单的一句话就是,指针就是个地址并不是值。

    另外建议在声明指针的时候请初始化,例如int *p=0;要不会出现很多不好的结果,详见老师给你吹嘘的那些。

    引用是在C++里面才提到的概念,简单的说就是取小名,张三是你,小三也是你。所以在函数中传参的时候int fun(&a);是会修改传进来那个参数的值,int fun(a)就不会。这种东西你试几遍就可以了解了。

    最后呢,&符号也是取地址的意思,int a=0&a就是a所在的地址的位置,结合指针的概念就可以理解,&其实是*的一种逆向操作。int *p; int a=0; p=&a;那么可以发现*p的值就是a的值。

     

     

    总结:

        总结一下,本章主要讲述了三个问题,第一,不用变量类型之间的精度问题;第二,声明变量的作用域问题(这个跟C语言有一点不同);第三,指针和引用的意义。以上纯属个人理解,不对的地方请指正。



  • 相关阅读:
    vue项目webpack配置terser-webpack-plugin 去掉项目中多余的debugger
    difference between count(1) and count(*)
    为什么PostgreSQL WAL归档很慢
    mysql_reset_connection()
    Oracle使用audit跟踪登录失败的连接信息
    .NET Standard 版本
    ASP.NET Web API版本
    我是如何用go-zero 实现一个中台系统的
    JAVA中文件写入的6种方法
    MySql 常用语句
  • 原文地址:https://www.cnblogs.com/Dr-XLJ/p/4616110.html
Copyright © 2011-2022 走看看