C++ for循环迭代后变量值被重置为0的技术问题求助
问题:机器人位移计算代码中变量无法持续累加
输入文件内容:
5 ENNEE
需求是通过代码计算机器人的总位移,让updown(南北方向)和sides(东西方向)变量在循环中持续累加变化,但实际运行时,每次循环迭代结束后变量都会重置为0,最终结果为0。问题代码如下:
#include <iostream> #include <fstream> #include <vector> #include <cmath> using namespace std; int main(){ int K; string commands; fstream fileIn("robotin.txt"); fileIn >> K >> commands; fileIn.close(); int updown = 0; int sides = 0; for(char i : commands){ //cout << i << " " << typeid(i).name() << endl; switch(i){ case 'N': updown +=1; cout << updown << endl; case 'S': updown -=1; case 'E': sides +=1; case 'W': sides -=1; } cout << "Updown is " << updown << endl << "Sides is " << sides << endl << endl; } fstream fileOut("robotout.txt"); fileOut << abs(updown) + abs(sides); fileOut.close(); return 0; }
错误原因
核心问题是switch语句的每个case分支后缺少break关键字。在C++的switch结构中,如果某个case执行完后没有break,程序会继续执行后续所有case的代码,不会跳出switch块。
以输入的'N'为例:
- 执行
case 'N':updown +=1,此时updown为1 - 没有break,继续执行
case 'S':updown -=1,updown回到0 - 继续执行
case 'E':sides +=1,sides为1 - 继续执行
case 'W':sides -=1,sides回到0
最终每次循环后两个变量都被重置为0,无法实现累加。
修正后的代码
在每个case分支末尾添加break,确保匹配到对应的case后只执行该分支的代码,然后跳出switch块:
#include <iostream> #include <fstream> #include <vector> #include <cmath> using namespace std; int main(){ int K; string commands; fstream fileIn("robotin.txt"); fileIn >> K >> commands; fileIn.close(); int updown = 0; int sides = 0; for(char i : commands){ switch(i){ case 'N': updown +=1; break; // 添加break case 'S': updown -=1; break; // 添加break case 'E': sides +=1; break; // 添加break case 'W': sides -=1; break; // 添加break } cout << "Updown is " << updown << endl << "Sides is " << sides << endl << endl; } fstream fileOut("robotout.txt"); fileOut << abs(updown) + abs(sides); fileOut.close(); return 0; }
修正后,输入ENNEE时:
- 3次'E'会让
sides累加为3 - 2次'N'会让
updown累加为2
最终总位移为3 + 2 = 5,符合预期。
内容的提问来源于stack exchange,提问作者qwerty uiop
相关产品推荐
相关产品推荐

