C++ 学习笔记(1)

摘要:本文是我个人对C++语言的认识和看法,以及以后在学习C++语言中自己要去遵守的一些规范和学习思路,提出了一个关于定义main函数及其返回值的讨论和解答。

这个学期开了C++还有单片机,想再加强一下C/C++语言,毕竟以后除了汉语和英语还得多掌握几门语言。近期的目标是复习C语言/汇编语言,学习C++语言,也许matlab语言也得学习一下。

买了一本参考书《C Primer Plus 》(中文第五版),借了两本参考书《程序设计基础》(吴文虎)和《 C++ Primer 》(第五版),现在看起来《程序设计基础》这本书是非常不错的,主要针对是的算法,穿插着C++的语法知识,看了几章感觉有点渐入佳境的感觉,还训练了一下逻辑思维,在此推荐一下。

第一篇C++学习笔记,先说一些前期的东西,主要是我的学习思路和其他的外部准备。

我是电气工程及其自动化专业的学生,以后大概不会以coding为生,但是现在在我看来,现在c/c++作为一种编程语言,能在以后的工作中提供很大的帮助,比如51需要用C51编程,ARM架构的K60也需要C语言,以后的DSP也需要(?大概是汇编),还比如最近学的《电力系统分析》中「潮流计算」计算机算法的实现,所以把C语言基本的语法、用法掌握,做到能看懂,以后会用,养成好的习惯,为以后工作打好基础。以上是基础,但通过电子设计大赛明白,对于「自动化」的核心就是控制,控制需要算法来实现,算法是框架,没有框架的话其他的都是空谈,所以更要注重算法的学习,在构建起算法的基础上,用编程实现,这才是我的最终目标,编程是为了完成任务。比如借的这本《程序设计基础》上,有很多算法,使我大大拓宽了眼界,实在是受益匪浅。

 思路(构建(数学)模型) --》 算法 --》编程构思 --》程序实现

既然开始了编程,那就很可能不是一个人的事情,所以一要遵循标准,二要有可读性。先说标准的问题:C/C++的标准,C最新的ISO标准是C99,C++最新的ISO标准是C++14,使用最新的标准不一定是最好的,但是起码不要使用20年前的C89的标准啊(比如现行很多高校的教材)。

C++ 学习笔记(1)_第1张图片
ISO C标准
C++ 学习笔记(1)_第2张图片
ISO C++标准

遵循标准,总是没错的。就像现在大三开的专业课,很多行业标准是需要严格遵守的(比如电气行业的DL标准),不能按照自己的想法,而是要遵循官方的、最新的行业规范来办事。

我的集成开发环境选择了VS2013community,但是据说对C99支持不好,但是对C++11支持较好,有机会的话再用更好用的开发环境吧,目前刚起步,够用就好。

2015/10/6 起使用Dev-C++ 5.11版本很好用。

谈了这么多空话,为什么要遵循标准呢?看下面这个例子:

所有的C程序都离不开主函数(main),但是现在我用过的课本都是这样写的

 void main(){ /* */}

如果写完程序,程序没有问题的话,编译运行是不会报错的(但是在Dev-C++会报错)

C++ 学习笔记(1)_第3张图片
使用Dev-c编译运行

但是,去看最新的C99标准:

C++ 学习笔记(1)_第4张图片
Stratup

标准要求的是:

int main() {/* */}or int main(int argc, char *argv[]){/* */}

并且在main函数的最后需要加一句 return 0;

在《C++ primer》中第一章也提到了:

main函数的返回类型必须为int,即整数类型。int类型是一种内置类型(build-intpye),即语言自身定义的类型。

为什么要用int型呢,而且返回数呢?我不知道,我去百度,

那么看一下CSDN上高手的讨论吧:

 假设用户的命令由command执行,首先command把程序加入内存,然后设置CPU的CS:IP指向程序的第一条指令(也就是程序入口,在C++中就是main()函数),从而使程序得以运行.程序结束后,返回到command中,CPU继续运行command.注意在返回的时候要有一个返回值,这样才能安全退出程序(注意我用的是退出一词),之后各寄存器会有恢复动作,如果没有返回值,虽然表面上看程序也正常结束了,但实际上它并没有退出,各寄存器并没有恢复,如CS:IP 还是指向程序尾部,如果得到CS:IP,那么可以让程序继续执行下去,但是所执行的程序已经不是你的代码所在的那段内存空间了,它在执行其它内存中的程序。

 main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。

也许一直用之前熟悉的套路,也许不问个为什么,一直会错下去,到最后debug都不知道哪里出现错误。如果一开始就使用标准的话,起码不会走弯路。

当然,阅读几百页的ISO标准是非常头疼的事,不过每次当新的标准发布时,看高手给出的update分析还是必须的(其实我就看过C89和C99的不同,还没看完……)。

PS:不过如果编译器不支持最新的标准好像也很无语,尤其是以后要面对工业环境、嵌入式的开发(比如给8051编程的Keil C51,是不支持c99标准的,但好像IAR就支持的挺好),都是古老的集成开发环境,不会追求最新的标准,这些环境的要求就是稳定,稳定压倒一切!所以是有点纠结的,新的东西肯定是为了用着更顺手,当习惯了一个方面快捷的标准,再去使用旧的不顺手的编写环境,内心一定是崩溃的,但必须适应。但目前来说抛弃VC++6.0是必须的,因为它甚至连win8.1都不支持!使用新的编译器,学习一个新的集成开发环境,也会是一个非常有趣的事!

C++ 学习笔记(1)_第5张图片
IAR Option

可以看到在IAR for ARM里的project option里 c dialect里有对C99的支持,还有VLA(Variable Length Array可变长度数组)。

标准都可以在ISO网站上查询到!

说完标准问题,说说我对可读性的理解:

在《程序设计基础》中,吴文虎老师提到:

程序是给人编的,让人家看懂是第一位重要的事。特别是将来的你可能参加一个团队,几十人甚至几百人一起合作,相互协同,就更须将注释写的清清楚楚了。

说的特别好,尤其是对于刚刚上路的我,添加了注释也是为自己一路点灯,要不然起了一堆乱七八糟的变量,不知道有什么用,很痛苦。写了一堆代码,不知道要干什么,也很痛苦。所以走一步点一盏灯,要不对于刚起步的菜鸡,容易迷路。当然也像吴老师说的那样,对于别人来说更是一件方便的事,当有了注释,更容易明白一个人思路。看到别人的代码是整齐的,起码才有了想读下去的冲动,要是写的乱七八糟,一点想看的欲望都没有(这好像高中的语文/数学/英语/等科目的卷面分啊!)。

代码整齐在VS2013里很智能,每一行的结束打上分号就会自动对齐。但VC++6.0就没这么好了,而且coding界面也不是很友好。VS2013虽然复杂,可是会很及时的提醒你一些语法上的错误,这样对于我这样的新手,更是一个再好不过的事啦!

C++ 学习笔记(1)_第6张图片
VS2013 Coding
C++ 学习笔记(1)_第7张图片
反汇编

唠叨了这么多,自己也烦了。但是工欲善其事,必先利其器,当大体的思路和目标在脑袋里形成,那么只需一步一步来就好。下面,就要真正的开始了!


参考资料:

关于C99与C89的不同:http://blog.csdn.net/leixiaohua1020/article/details/12761053

main函数返回值类型的讨论:http://bbs.csdn.net/topics/200039113

ISO官网:http://www.iso.org/iso/home.html

你可能感兴趣的:(C++ 学习笔记(1))