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

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

综述:

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

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

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

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

一、基本的内置类型

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

第一,各种类型的位数。

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

至于浮点数的精度问题,简单的就是如何选用float和double的这个问题来说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=100,18行的for语句运行完i应该是9,但是括号结束了,那个等于9的i就没有用了,所以又成了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语言有一点不同);第三,指针和引用的意义。以上纯属个人理解,不对的地方请指正。

小猪猪逆袭成博士之C++基础篇(一)数据精度、强制类型转换、变量命名规则的更多相关文章

  1. 小猪猪逆袭成博士之C++基础篇(三)字符串

    小猪猪逆袭成博士之C++基础篇(三)字符串 String 写在题外的话: 非常感谢在我发了第一篇随笔以后有很多人看还评论了,这大概就是一种笔记性质的,也不一定全对,如果不对的地方请指出来让我加以改正. ...

  2. 小猪猪逆袭成博士之C++基础篇(二) 常量、处理类型、自定义头文件

    小猪猪逆袭成博士之C++基础篇(二) const .auto. decltype 上一章我们介绍了一些常用的类型和常见的问题,下面再介绍一些学习的时候不是特别常用但是在实际工程中很有用的一些东西. 一 ...

  3. 聊聊java基础,int值强制类型转换成byte

    聊聊java基础,int值强制类型转换成byte 知识点:byte.short.char在表达式中会自动提升为int 之前做一个应用时,打印IP地址,因为是用4个byte存储的,所以打印的时候值范围是 ...

  4. Intel:从屌丝逆袭成业界大佬

    原创文章,转载请标明出处哈,Thanks♪(・ω・)ノ. 参考<Linux内核情景分析><深入理解计算机系统><深入理解linux内核><Orange'S:一 ...

  5. 快递小哥逆袭自传:用了6年时间做到了IT部门主管

    在我30岁生日那天,终于收到升职的通知,自己如愿的也从一名小小程序员升职成为IT主管,负责公司硬件设备驱动程序开发项目,工资也从原来月薪10K变到现在月薪20K.或许对于很多人而言,在三十岁的时候,可 ...

  6. 成小胖学习ActiveMQ·基础篇

    过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...

  7. 《成神之路-基础篇》JVM——Java内存模型(已完结)

    Java内存模型 本文是<成神之路系列文章>的第一篇,主要是关于JVM的一些介绍. 持续更新中 Java内存模型 JVM内存结构 VS Java内存模型 VS Java对象模型(Holli ...

  8. 二本毕业,我是如何逆袭成为BAT年薪40W的Java工程师的?

    身边的师弟师妹经常问到:非计算机专业出身,你是在2年内如何逆袭成BAT年薪40W的资深开发工程师的.其实很简单——努力! 我16年毕业于普通的二本学校,非计算机专业出身,只因为对软件开发感兴趣,所以找 ...

  9. 小课堂Week9 例外处理设计的逆袭Part2

    小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...

随机推荐

  1. 有哪些适合学生参与的 C++,网络编程方面的开源项目?

    有哪些适合学生参与的 C++,网络编程方面的开源项目?   Tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通 ...

  2. Java学习之InputStream中read()与read(byte[] b)

    Java学习之InputStream中read()与read(byte[] b) 这两个方法在抽象类InputStream中都是作为抽象方法存在的, JDK API中是这样描述两者的: read() ...

  3. Android @+id与@id的区别

      Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@ ...

  4. Div实现滚动条效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. HTTP错误500.22 检测到在集成的托管管道模式下不适用的ASP.NET设置

    这里主要把集成模式改成经典模式 解决方案一: 解决方案二: 修改配置文件web.config 将 <configuration> <system.web> <compil ...

  6. 初学JSoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出 ...

  7. php采集文章中的图片获取替换到本地

    /** * 获取替换文章中的图片路径 * @param string $xstr 内容 * @param string $keyword 创建照片的文件名 * @param string $oriwe ...

  8. Problem F: Exponentiation大数求幂

    DescriptionProblems involving the computation of exact values of very large magnitude and precision ...

  9. leetcode Contains Duplicate python

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  10. php json_encode url链接出现双转义字符‘\\’和中文被编码的解决方法

    在PHP开发中 json_encode方法使用的频率还是蛮高的. 当数据中出现中文是,经过json_encode后,中文被编码了,不是显示的原中文字符. 可以通过urlencode编码后,在使用jso ...