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

在for循环外打印变量j时出现未声明标识符错误

问题分析与解决

错误原因

你遇到的undeclared identifier 'j'错误,核心是C语言的变量作用域规则:

  • 你在内部for循环里用int j = 1声明的变量j,作用域仅限这个for循环的代码块内。
  • 循环结束后j会被销毁,后续的printf语句在循环外部,自然无法访问这个已不存在的变量。

另外代码还有两个隐性问题:

  1. 内部for循环未用花括号包裹代码块,可读性差且易引发逻辑错误;
  2. 第二个printf的格式字符串(%i)(%i)对应两个占位符,但仅传入一个参数,会导致未定义行为。

修复方案

根据你的代码意图,分两种场景处理:

场景1:需要在循环外使用j的值

如果确实要在循环结束后打印j,把j的声明移到内部循环外面即可:

// Record preference if vote is valid
bool vote(int voter, int rank, string name)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (strcmp(candidates[i].name, name)==0)
        {
            int j; // 将j的声明移至循环外
            for(j = 1; j < candidate_count; j++)
            { // 用花括号包裹循环体
                preferences[i][j] = rank;
            }
            printf("i = (%i) j = (%i)\n", i , j);
            // 修正printf格式,匹配参数数量
            printf("preferences[i][j] = (%i)\n", preferences[i][j]);
            return true;
        }
    }
    printf("text");
    return false;
}

场景2:仅需在循环内打印j

如果目的是每次循环时打印j,将printf移到内部循环里:

// Record preference if vote is valid
bool vote(int voter, int rank, string name)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (strcmp(candidates[i].name, name)==0)
        {
            for(int j = 1; j < candidate_count; j++)
            {
                preferences[i][j] = rank;
                printf("i = (%i) j = (%i)\n", i , j);
                printf("preferences[i][j] = (%i)\n", preferences[i][j]);
            }
            return true;
        }
    }
    printf("text");
    return false;
}

额外逻辑提醒

从函数参数voter和rank来看,你的preferences数组逻辑可能不符合CS50 runoff项目要求——通常这个数组应该是preferences[voter][rank] = i(记录第voter位选民把第rank顺位票投给第i位候选人),建议核对项目里的数组定义。

内容的提问来源于stack exchange,提问作者Neuquert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:01:02