为何C++中循环变量可在循环作用域外部访问?
为啥你这段C++代码里,for循环的计数器能在循环外面用?
哈哈,这个问题其实是C++版本迭代留下的“历史痕迹”,很多刚接触不同标准的同学都会懵一下,我来给你掰扯清楚:
首先说核心原因:C03和C11及之后的标准,对for循环头里定义的变量作用域规则不一样。
- 在C++03以及更早的老标准里,你在
for循环头里声明的int i,它的作用域是包含这个循环的整个外层代码块,不是循环体那一对大括号里。所以循环跑完或者break出来后,外面的代码照样能访问到这个i,它的值就是退出循环时的那个数值——要么是循环正常结束的count,要么是触发break时的i。 - 但从C11开始,标准改了这个规则:循环头里定义的变量,作用域被严格限制在循环体内部了。循环一结束,这个变量就“消失”了,外面根本访问不到。要是你用支持C11+的编译器编译第一段代码,直接会报
i未定义的错。
你自己做的测试也很能说明问题:把循环变量改成i1后,外面再用i就报错了,这正好证明原来的代码里,循环内外的i确实是同一个变量——因为原来的i是在循环头里定义的,按老标准作用域延伸到了外面,而改成i1后,i从来没被定义过,自然报错。
给你两个解决/优化的思路:
- 要是想兼容新老标准,或者就是需要在循环外用到这个计数器,那就把变量提前在循环外面声明:
int i = 0; for (; i < count; i++) { if (&array[i].GetData() == el) break; } if (i < count) { // .. 执行操作 }
- 要是想贴合现代C++的写法,尽量缩小变量作用域(这也是现代编程的好习惯),可以把要执行的操作直接挪到循环内部的if里:
for (int i = 0; i < count; i++) { if (&array[i].GetData() == el) { // .. 执行操作 break; } }
内容的提问来源于stack exchange,提问作者johngreen
相关产品推荐
相关产品推荐

