C语言代码编译报undeclared identifier错误,提示标识符i未声明
问题现象
完成CS50课程金字塔打印C语言练习时,编译代码触发undeclared identifier错误,编译器提示标识符i未声明,无法完成编译,原始代码如下:
#include <stdio.h> #include <cs50.h> int main(void) { int height; do { // Asking for # of blocks height = get_int("Height: "); } // Setting min/max height while (height < 1 || height > 8); // For columns for (int i = 0; i < height; i++) // For spaces for (int j = height - 1; j > i; j--) { printf(" "); } // For the #'s for (int j = 0; j <= i; j++) { printf("#"); } printf("\n"); }
错误原因
- C语言for循环遵循默认规则:如果for语句后没有用花括号
{}显式包裹循环体,仅会将紧随for语句的第一条可执行语句/代码块判定为循环内部内容。 - 外层控制行数的
for (int i = 0; i < height; i++)没有添加循环体花括号,它的作用域仅覆盖后面打印空格的内层for循环。 - 打印
#的内层for循环、末尾打印换行的printf("\n")都不在外层i声明所在的循环作用域内,这个位置的i已经超出生命周期,编译器找不到对应声明,就会抛出标识符未定义的错误。 - 附带逻辑问题:就算不触发
i的报错,现有代码的换行逻辑只会在所有循环执行完成后打印一次换行,无法实现金字塔逐行换行的效果,输出格式完全错误。
修复方案
给外层控制行数的for循环添加花括号,将单行列印所需的「打印前置空格、打印#块、打印行尾换行」所有逻辑都包裹到外层循环的作用域内,修复后可正常编译运行的代码如下:
#include <stdio.h> #include <cs50.h> int main(void) { int height; do { // 获取用户输入的金字塔高度 height = get_int("Height: "); } // 限制合法高度范围为1-8 while (height < 1 || height > 8); // 外层循环逐行打印 for (int i = 0; i < height; i++) { // 打印当前行前置空格 for (int j = height - 1; j > i; j--) { printf(" "); } // 打印当前行的#块 for (int j = 0; j <= i; j++) { printf("#"); } // 每行打印完成后换行 printf("\n"); } }
编译运行后输入1-8之间的数字,即可输出符合CS50练习要求的金字塔图案。
内容的提问来源于stack exchange,提问作者Dackeriah
相关产品推荐
相关产品推荐

