关于C/C++编译器的默认优化以及volatile关键字的使用
今天刷题,由于自己的粗心,讲赋值号写成==了,导致编译器把某段代码优化,而出了一个很诡异的bug,故提笔记之
请看代码
for(int len=1;len<=n;len++){
for(int i=0;i<=n-len;i++){
if(1==len){
tags[i][i]==1;
}else if(len==2){
if(s[i]==s[i+1]){
tags[i][i+1]=1;
}
}else{
if(s[i]==s[i+len-1]&&tags[i+1][i+len-2]){
tags[i][i+len-1]=1;
}
}
if(tags[i][i+len-1]>0){
if(len>res.size()){
res=s.substr(i,len);
}
}
}
}
在第一个if(len==1)的代码块中,由于我的粗心,我把赋值语句tags[i][i]=1写成了tags[i][i]==1。很明显,这句代码独立出来是没有任何意义的,所以编译器在编译这个if的时候,会把他以及后面跟的大括号中的代码块默认的删除(优化)掉。我们在执行的时候,不管len是否等于1,都不会执行这块。但是,如果我们在前面声明tags数组的时候,在前面加上了volatile的话
volatile int tags[100][100];
编译器对于我们所有包含tags的代码块,都不会做优化,之后。我们在debug的时候我们可以发现。这段当len1时,if(len1)后面的代码块是可以进入的。
好啦,就说到这啦,这是一个特别有趣的现象,因为有的时候由于我们的粗心,写出无效代码块来的时候,我们debug的时候会发现这段代码块根本进不去,很反常!!!
所以小伙伴们写代码的时候一定要细心呀