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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:18:18