小猪猪逆袭成博士之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. 【Windows 8 Store App】学习二:ResourceLoader

    原文 http://www.cnblogs.com/java-koma/archive/2013/05/22/3093308.html 在项目开发时,通常有一些资源信息需要存储起来,比如请求的URL, ...

  2. 简单实现计算Edit Distance算法

    最近因为工作需要,学习了NLP的相关知识,简单动手实现了一下计算Edit Distance的算法,就是计算一个字符串要变成另一个字符串需要的代价,这其中采用Levenshtein方式,即规定一个插入和 ...

  3. ldap for ruby

    Net::LDAP for Ruby (also called net-ldap) implements client access for the Lightweight Directory Acc ...

  4. 2014 Web开发趋势

    本文翻译自:http://www.pixelstech.net/article/1401629232-Web-design-trends-for-2014 如今,已然到了Web横行的时代.越来越多的资 ...

  5. CRM需要注意的一些事,修改字段类型

    crm字段类型如果变了,比如文本类型变为查找类型,要新建命名跟原来不一样,千万不能删除以前的字段再建原来的一样的,那样如果导到正式系统会造成无法导入,执行sql失败, 切记切记.可以字段名后加2,或者 ...

  6. LayoutInflater作用及使用

    作用: 1.对于一个没有被载入或者想要动态载入的界面, 都需要使用inflate来载入. 2.对于一个已经载入的Activity, 就可以使用实现了这个Activiyt的的findViewById方法 ...

  7. C++ this 指针

    类的(非静态)成员函数具有一个附加的隐含形参,即指向该类对象的一个指针.这个隐含形参命名为this,与调用成员函数的对象绑定在一起.成员函数不能定义this形参,而是由编译器隐含地定义.成员函数的函数 ...

  8. SDOI2008 Sandy的卡片( 后缀数组 )

    求出后缀数组, 然后二分答案, 对height数组分组检验答案. 时间复杂度O(|S| log|S|) ------------------------------------------------ ...

  9. java面向对象之 类和对象

    OOP:Object Oriented Programming(面向对象编程) 面向对象: 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在 ...

  10. JSTL与EL常用标签(转)

    JSTL与EL EL相关概念 JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程 ...