小猪猪逆袭成博士之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&#183;基础篇
过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...
-
《成神之路-基础篇》JVM——Java内存模型(已完结)
Java内存模型 本文是<成神之路系列文章>的第一篇,主要是关于JVM的一些介绍. 持续更新中 Java内存模型 JVM内存结构 VS Java内存模型 VS Java对象模型(Holli ...
-
二本毕业,我是如何逆袭成为BAT年薪40W的Java工程师的?
身边的师弟师妹经常问到:非计算机专业出身,你是在2年内如何逆袭成BAT年薪40W的资深开发工程师的.其实很简单——努力! 我16年毕业于普通的二本学校,非计算机专业出身,只因为对软件开发感兴趣,所以找 ...
-
小课堂Week9 例外处理设计的逆袭Part2
小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...
随机推荐
-
网络安全——数据的加密与签名,RSA介绍
一. 密码概述 发送者对明文进行加密然后生成密文,接受者再对密文解密得到明文的过程. 现在使用的所有加密算法都是公开的!但是密钥肯定不是公开的. 1 散列(哈希)函数 通常有MD5.SHA1.SHA2 ...
-
mongodb 3 常用命令操作
操作命令详见,这个归类很好,有些教程乱麻麻的 http://www.tuicool.com/articles/j2ueau db.createUser({user:"zhihuiroot&q ...
-
singleTask, singleInstance使用心得
1. singleTask, singleInstance 共同点: 1) 一旦入栈,都为于栈底. 2) 全栈有且只有一个activity实例对象. 2. singleTask, singleIns ...
-
如何成为uber司机,uber司机详细注册流程
怎样注册uber司机 如何注册加入uber司机 全国加入Uber 的要求 车辆要求:要求裸车价8万以上,车龄5年以内,第三者责任险保额30万以上,不支持20万以下的面包车/商务车,不支持4座以下车辆. ...
-
hibernate总结-持续更新
简介 hibernate官网:Hibernate Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思 ...
-
c++字节对齐编译器指令#pragma
第一种 #pragma pack(push, 1) // 先把当前对齐设置压栈,再设置为1字节对齐 struct S { char a; ]; }; #pragma pack(pop) // 恢复先前 ...
-
Cocos动作执行时,同时执行完毕再进行下一步的方式
在js中,runAction是统一保存起来等单个文件运行完了再统一进行回调运行的,所以如果想在动作执行完毕之后调用某个函数,那这个函数就应该存在于回调函数中,不会就不能同步了
-
LNMP下安装Pureftpd开启FTP服务以及修改FTP端口的方法
LNMP 环境包 1.2 内置了 Pureftpd 的安装程序. 安装 Pureftpd 进入lnmp解压后的目录,执行:./pureftpd.sh 会显示如下图: 按提示输入当前MySQL的root ...
-
Office2013中文激活版
国内的WPS专业版也是很不错的,习惯的Office.office2013很不错的办公利器 00.PPT 01.Word 02.Excel Download: 链接: https://pan.baidu ...
-
cmd下查看端口被某程序占用命令
经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口,很多人都比较头疼,下面就介绍一种非常简单的方法,希望对大家有用 假如我们需要确定谁占用了我们的9050端口 ...