C/C++编译器优化所带来的bug

关于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的时候会发现这段代码块根本进不去,很反常!!!

所以小伙伴们写代码的时候一定要细心呀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值