小猪猪逆袭成博士之C++基础篇(一)数据精度、强制类型转换、变量命名规则
小猪猪逆袭成博士之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++基础篇(一)数据精度、强制类型转换、变量命名规则的更多相关文章
- 小猪猪逆袭成博士之C++基础篇(三)字符串
小猪猪逆袭成博士之C++基础篇(三)字符串 String 写在题外的话: 非常感谢在我发了第一篇随笔以后有很多人看还评论了,这大概就是一种笔记性质的,也不一定全对,如果不对的地方请指出来让我加以改正. ...
- 小猪猪逆袭成博士之C++基础篇(二) 常量、处理类型、自定义头文件
小猪猪逆袭成博士之C++基础篇(二) const .auto. decltype 上一章我们介绍了一些常用的类型和常见的问题,下面再介绍一些学习的时候不是特别常用但是在实际工程中很有用的一些东西. 一 ...
- 聊聊java基础,int值强制类型转换成byte
聊聊java基础,int值强制类型转换成byte 知识点:byte.short.char在表达式中会自动提升为int 之前做一个应用时,打印IP地址,因为是用4个byte存储的,所以打印的时候值范围是 ...
- Intel:从屌丝逆袭成业界大佬
原创文章,转载请标明出处哈,Thanks♪(・ω・)ノ. 参考<Linux内核情景分析><深入理解计算机系统><深入理解linux内核><Orange'S:一 ...
- 快递小哥逆袭自传:用了6年时间做到了IT部门主管
在我30岁生日那天,终于收到升职的通知,自己如愿的也从一名小小程序员升职成为IT主管,负责公司硬件设备驱动程序开发项目,工资也从原来月薪10K变到现在月薪20K.或许对于很多人而言,在三十岁的时候,可 ...
- 成小胖学习ActiveMQ·基础篇
过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...
- 《成神之路-基础篇》JVM——Java内存模型(已完结)
Java内存模型 本文是<成神之路系列文章>的第一篇,主要是关于JVM的一些介绍. 持续更新中 Java内存模型 JVM内存结构 VS Java内存模型 VS Java对象模型(Holli ...
- 二本毕业,我是如何逆袭成为BAT年薪40W的Java工程师的?
身边的师弟师妹经常问到:非计算机专业出身,你是在2年内如何逆袭成BAT年薪40W的资深开发工程师的.其实很简单——努力! 我16年毕业于普通的二本学校,非计算机专业出身,只因为对软件开发感兴趣,所以找 ...
- 小课堂Week9 例外处理设计的逆袭Part2
小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...
随机推荐
- CentOS 删除自带的OpenJDK 和 安装SunJDK
[root@WX32 local]# java -version java version "1.6.0" OpenJDK Runtime Environment (build - ...
- chrome 下的 proxy 插件安装
Install “Proxy SwitchyOmega” extensions for chrome.
- C++_auto
自动变量,自动获取类型,输出,泛型 自动变量,可以实现自动循环一维数组 自动循环的时候,对应的必须是常量 //auto自动变量,自动匹配类型 #include <iostream> usi ...
- golang 之 defer(统计函数执行时间)
package main import ( "fmt" "time" ) func sum(a ...int) int { defer trace(" ...
- Nodejs解析HTML网页模块 jsdom
工作需要抓取某些网页,所以今天试用下了node下的jsdom模块.同样功能的还有jquery jsdom https://npmjs.org/package/jsdom API很简单. jsdom.e ...
- 64位windows8.1编译openjdk8
首先下载openjdk8http://hg.openjdk.java.net/jdk8/jdk8/这里用到版本管理工具Mercurial,与git有些类似,不了解的话可以查一下.clone后,里面有个 ...
- javascript操作JSON对象,增加 删除 修改
JS只能输入数字,数字和字母等的正则表达式 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace( ...
- 玩转kindle paperwhite: 如何越狱,安装强大外挂软件koreader
NOTICE 1: 在更新kpvbooklet和使用最新版本的koreader(v2013.03-211)时候,会出现pdf文档无法重排的错误.亲测. 如果你是使用的最新版本koreader且出现上述 ...
- objective-C学习笔记(一)OBJC简介
如何掌握一门高级编程语言:(这里特指Objective-C) 底层思维: 向下,如何从机器底层的角度来思考程序运行的过程. 关注语言构造.编译转换.内存模型.运行时机制 抽象思维: 向上,当软 ...
- URL编码解码
ios url 编码和解码 1.url编码 ios中http请求遇到汉字的时候或者像是%…@#¥%&*这些字符的时候也可以使用下面的方法,需要转化成UTF-8,用到的方法是: NSString ...