在for循环外打印变量j时出现未声明标识符错误
问题分析与解决
错误原因
你遇到的undeclared identifier 'j'错误,核心是C语言的变量作用域规则:
- 你在内部
for循环里用int j = 1声明的变量j,作用域仅限这个for循环的代码块内。 - 循环结束后
j会被销毁,后续的printf语句在循环外部,自然无法访问这个已不存在的变量。
另外代码还有两个隐性问题:
- 内部
for循环未用花括号包裹代码块,可读性差且易引发逻辑错误; - 第二个
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
相关产品推荐
相关产品推荐

