如何在含同名变量的循环中使用函数参数?
如何在同名循环变量的作用域内访问函数参数?
这是个很常见的变量遮蔽(shadowing)问题——循环里的局部val把函数参数的val给“盖住”了,所以在循环里直接写val只会指向循环变量。这里有两个实用的解决办法:
1. 重命名变量(最推荐)
最简单也最能提升代码可读性的方式,就是把循环变量改成别的名字,比如loopVal或者i这种常用的循环变量名。这样函数参数的val在整个函数作用域里都能直接访问,完全不会有混淆:
void someFunction(int val, ...) { // 其他代码 for(int loopVal = 0; loopVal < 10; loopVal++) { cout << val; // 这里的val就是函数参数啦 } }
2. 用临时变量暂存参数值
如果实在不想改变量名(比如有特殊需求),可以在进入循环之前,把函数参数val的值存到一个新的临时变量里,之后在循环内用这个临时变量来访问原参数的值:
void someFunction(int val, ...) { int paramVal = val; // 先把参数值存起来 // 其他代码 for(int val = 0; val < 10; val++) { cout << paramVal; // 通过临时变量访问原参数 } }
为什么会出现这个问题?
在C++里,内层作用域的同名变量会遮蔽外层作用域的变量。循环的for括号里定义的val属于循环体的局部作用域,优先级比外层的函数参数val高,所以在循环里直接引用val时,编译器会优先选择内层的循环变量。
个人强烈建议用第一种方法,毕竟清晰的变量名能帮你和其他维护代码的人避免很多不必要的困惑~
内容的提问来源于stack exchange,提问作者ronit vairagi
相关产品推荐
相关产品推荐

