第156章
上面这个例子是和return相关的死代码检测,不过还有其它一些死代码检测,比如:
iffalse:
prie"
或者:
&rue:
...//代码块没有break
&urn//永远执行不到
或者:
foriinl:
&inue
prie"
这类检测很多编译器也都实现了,其实就是对各种情况分别做判断
larva在流程分析上做的还有一点不够好的是变量初始化和使用的分析,比如:
funcf():
printa
a=123
根据语法规定,a是一个局部变量,若是python,则会在运行时查出错误,但是larva为了运行效率,省掉了这一步,因此规定,所有变量(larva不像python可以动态增减变量,所以编译期可以完全确定)的初始值是未定义的(但实际实现中,一般是赋一个合适的初值,比如nil),这点和其它语言有类似之处,比如C代码:
inta;
printf("%d",a);
a=123;
只不过,C编译器会对这个流程做分析,提示错误或告警。但这种分析往往是基于代码前后位置的,有时候程序员可能写出语法和语义上都没啥问题的,但编译器比较难分析的代码,比如:
foriinlist:
ifi==1:
printa
else:
a=123
若list是[0,1],则这段代码是没啥问题,由于循环和判断,a是先赋值再打印的,但是编译器比较难检测这种情况,因为根本不知道list是什么内容,但有的时候又的确会存在这种代码,所以最好的处理方式也只能是给一个警告了,程序员可以在for之前给a赋值一个nil来消除这个警告,虽然这个赋值没什么用
有人可能会说,只要所有变量都初始化就行了,这话其实只说对了一半,正确的说法是,只有所有变量都用字面量或按执行顺序有依赖地初始化,才能规避初值未定义的问题,比如这个代码:
a=b
b=a
a和b的确“初始化”了,但它们互相依赖了,甚至对于这种代码:
a=a
其实写了等于没写,虽然现代C++编译器已经尽可能检查这类问题,但也有漏的,比方说在vs中的这个代码(a是局部变量):
Aa=a+1;
A是一个class,实现一下拷贝构造和operator+(int),就
可以看到,这行在a初始化之前就调用了operator+(int),是可能出问题的,而且编译器没有警告
如果是上面两个变量的例子,改成这样:
inta=1;
intb=a;
如果执行顺序如此,是没啥问题,但如果这两句执行顺序不固定,就可能有问题,比如这两句在两个不同模块,和运行时模块加载和初始化顺序有关,就可能有问题了。
小玲,我这样写的话你还要这样解释,你能不能听懂这个意思啊?其实这个代码是非常简单的,这个也是我们以后在服务器编程里面所面临的一些代码。
我看到了一点眉目啊,但是也不是完全很懂,所以这后面的话我也要像类似的一些代码的话,也要自己学习啊,就可以了。
你也在刚学的话就可以看懂一些,那证明的话,你的基础还是有的,你已经超过了绝大部分人,因为我们知道c++语言是特别难的,他就是针对一个服务器编程的一个那个,其实我们还有一些都就是说游戏架构的一些引擎之类的语言的话,到时候也要学习一部分的。
你这样说来的话,我一听我就怕了,我们还有游戏引擎,这是我的我们女孩子是不是没必要学习啊,所以说这个是以后的话我要学习啊,美工之类的。
你学习每共时时间已经错过了,要学的话刚开始就要开始学了,这个时候时间点的话再去学一个新的知识的话也没那么快,你c++有基础的,你怕什么?人家都说了大学人有可能读4年的话,C++都没有入门都有可能,所以说这个是一个学起来就学入门了,就是非常厉害的一个。
唉,能听到你的夸奖的话,我真的是很欣慰啊,所以说但是我不能就是说尽因为你一句夸奖的话我就飘飘然了,我还是要放下心来好好的学习呢。
肯定的啦,像现在包括其实所有人都是要学习的,每个人都不是开刚开始就是天才,他是通过不停的后后期的努力练就的,还有这一点的话你一定要虚心起来,也不是说完全说你的美工就没办法学习,但是毕竟美工的话,你如果真的感兴趣的话,我们两个人也可以一起学习美工之类的。
好吧,如此甚好,反正我们什么东西都一起学习的话,那你进步的也很快再说,那样的话,晚上有一个人在带头的话,另外一个人也不会学的,感觉学的很累,这一点也是我们需要共同学习的。
让你肯学习什么的时候都不玩,你像那个之前不是有一家公司搞数据库的嘛,那也就现在总经理,哪一家公司我就不点名了,32岁还是有一事无成,然后他32岁发明了一个数据库,然后现在成了世界首富。
那一个公司的一个那个人非常励志,然后他之前32岁的话,他的女朋友什么都没有,一无所有,就是连一个简单的工程师都上不上,女朋友都离离他出走了,然后他身上简直也没有任何成就,也没有任何钱,所以说不知道他靠什么样的毅力支撑他下去了,现在成世界首富了。
很简单人在挫败中就要学会成长,他都是因为挫败的话使他不停的成长。
但也不能就是说进步这么快啊,所以说他应该有过人的天赋吧,就跟你一样。
你这点说的也很对,他可能对数据库天,天然的话有一种那种很敏感的感觉吧,所以说就导致了他后面在不停的鞭策自己,然后在不停的学习所有后面的成就,所以说任何的时候任何年龄都不晚,只要我们肯学习,那些都不是阻碍我们前进的脚步。
方远你能有这么深奥的悟性的话,我真的要向你学习。
在学习的话不是一句空话一定要付诸于行动,我看你对编程代码的话也还是有一些怕,有的时候不敢下手,这一点的话非常致命的。
不致命的,我现在学习还来得及。
好吧,你能这样说了是更好的了,我们现在抓紧时间搞编程吧。其他的事以后再说,还有这些励志的故事的话,你也要多看一些书本之类的,那样的话就会更好,我们都是普通人,这些事情的话只是一个我们看到的过程而已,并不能严格要求自己,就是成为像那个名人一样。