如何使用range based for loop接收输入及修改数组值无效问题解析
范围for循环无法修改原数组的核心原因
你代码中for(auto x:arr)的写法里,auto x会拷贝数组当前迭代的元素值到临时变量x中,你在循环内对x的所有修改都只会作用在这个临时拷贝上,完全不会影响原数组的存储内容,所以最后打印数组还是原来的初始值。
范围for循环的内部运行逻辑
针对你用的数组类型,C++的范围for循环会被编译器展开为等价的普通for循环逻辑:
// 原始写法:for(auto x:arr) { /* 循环体 */ } int *begin = arr; int *end = arr + 5; // 5是数组的长度,编译期自动推导 for(; begin != end; ++begin) { auto x = *begin; // 这里就是值拷贝的根源 /* 你的循环体内容 */ }
你输入到x的值只会存在于每次迭代的临时变量里,迭代结束后临时变量就销毁了,原数组的元素*begin完全没有被改动。
正确读取输入的写法
如果需要修改原数组的元素,要把循环变量声明为左值引用,让x直接绑定到数组的元素上:
for(auto &x:arr) // 加&声明为引用 { cin >> x; // 此时修改x等价于修改原数组对应的元素 }
修改后重新运行程序,第三次打印的数组就会是你输入的新值了。
内容的提问来源于stack exchange,提问作者Pranshu_Taneja
相关产品推荐
相关产品推荐

