You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'为例:

  1. 执行case 'N':updown +=1,此时updown为1
  2. 没有break,继续执行case 'S':updown -=1,updown回到0
  3. 继续执行case 'E':sides +=1,sides为1
  4. 继续执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:05:05