上面这个例子是和return相关的死代码检测,不过还有其它一些死代码检测,比如:
iffalse:
prie"
或者:
whiletrue:
...//代码块没有break
return//永远执行不到
或者:
foriinl:
break//或ue
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++都没有入门都有可能,所以说这个是一个学起来就学入门了,就是非常厉害的一个。
唉,能听到你的夸奖的话,我真的是很欣慰啊,所以说但是我不能就是说尽因为你一句夸奖的话我就飘飘然了,我还是要放下心来好好的学习呢。
肯定的啦,像现在包括其实所有人都是要学习的,每个人都不是开刚开始就是天才,他是通过不停的后后期的努力练就的,还有这一点的话你一定要虚心起来,也不是说完全说你的美工就没办法学习,但是毕竟美工的话,你如果真的感
>>>点击查看《网游之冰封影魔》最新章节