为何for循环中声明的j被判定为未声明标识符?如何修复?
C语言for循环变量作用域问题修复方案
问题描述
编写了一段C语言代码,外层for循环遍历变量i,内层for循环声明了int j,随后执行switch语句处理grid[i][j],之后通过printf输出grid[i][j]。但编译器提示printf中的j是未声明标识符,尽管已在for循环中声明了j;若注释掉整个switch语句,代码即可正常运行。代码如下:
for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) switch(grid[i][j]){ case '.': colourChange(WHITE); break; case 'P': colourChange(YELLOW); break; case 'G': colourChange(PINK); break; case 'W': colourChange(BLUE); break;} printf("%c ", grid[i][j]); printf("\n"); }
问题原因
C语言中,for循环如果没有用大括号{}包裹循环体,那么只有紧跟在for语句后的第一条语句属于循环体。这里内层for循环后直接跟的是switch语句,所以j的作用域仅局限于这个switch语句块内。后面的printf语句不在内层for循环的范围内,自然无法识别变量j。
修复方案
给内层for循环添加大括号,将switch和printf都包裹进循环体,让j的作用域覆盖这两个语句:
for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { // 添加左大括号 switch(grid[i][j]){ case '.': colourChange(WHITE); break; case 'P': colourChange(YELLOW); break; case 'G': colourChange(PINK); break; case 'W': colourChange(BLUE); break; } printf("%c ", grid[i][j]); // 现在j处于作用域内 } // 添加右大括号 printf("\n"); }
内容的提问来源于stack exchange,提问作者user20697783
相关产品推荐
相关产品推荐

