且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C++的变量作用域

更新时间:2022-09-10 07:56:55

这几天帮师兄做仿真,由于特别急,代码写的很乱,我一半写代码都用C语言的风格,即使编的是CPP文件。

C++中,可以随便定义变量,比C语言好用,标准的C语言是不支持for(int i = 0; i < 5; i++)的。C++中有这个特性,让我犯了一个很简单的错误,花了一天时间才把bug找出来。

为了让自己不再犯这么低级的错误,特地写一篇日志纪念一下。

一开始写了这样的代码:


  1. if(len == 1) 
  2.     sp[0] = 1; 
  3.     sp[1] = end; 
  4.   
  5.     for(int k = 0; k < sub[sn_index].links; k++) 
  6.         if((sub[sn_index].link[k].from == start && sub[sn_index].link[k].to == end)|| 
  7.            (sub[sn_index].link[k].from == end && sub[sn_index].link[k].to == start)) 
  8.             break
  9.     if(k == sub[sn_index].links) 
  10.         return 0; 
  11.    
  12.     if(sub_req[req_index][subreq_index].link[index].bw > s2v_l[sn_index][k].rest_bw) 
  13.            return 0;     
  14.     return 1; 

编译错误,下面的k的作用域有问题,然后我增加了int k


  1. if(len == 1) 
  2.     sp[0] = 1; 
  3.     sp[1] = end; 
  4.     int k; 
  5.     for(int k = 0; k < sub[sn_index].links; k++) 
  6.         if((sub[sn_index].link[k].from == start && sub[sn_index].link[k].to == end)|| 
  7.            (sub[sn_index].link[k].from == end && sub[sn_index].link[k].to == start)) 
  8.             break
  9.     if(k == sub[sn_index].links) 
  10.         return 0; 
  11.     if(sub_req[req_index][subreq_index].link[index].bw > s2v_l[sn_index][k].rest_bw) 
  12.            return 0;     
  13.     return 1; 

编译通过了,很开心,大部分结果都对,有一部分结果老是不对,我找啊找,就是没找到原因,最后我终于找到了,C++怎么都不警告我一下呢。

但是为什么没有出现段错误呢?我把第一个k全部打印出来,结果全是0,理论上k应该是不确定的,我用的是64位Linux,换成32位的试试,果然出现段错误了,但是64位也应该出段错误啊。我换了一台64位的机器,打印第一个k,前边很多都是0,后来出来一个大数,段错误了。


本文转自nxlhero 51CTO博客,原文链接:http://blog.51cto.com/nxlhero/731123,如需转载请自行联系原作者