循环内外声明变量的疑问:为何在循环内声明num会报错?
问题解答
示例代码
#include <stdio.h> #include <stdlib.h> int main() { int num; printf("Enter number :-"); scanf("%d" , &num); int D = 2 ; while(D > 1) { int denom ; denom = (num%D); if(denom == 0) { break; } D++; } printf("GCD of your input is %d" , D); }
程序说明
该程序会让用户输入一个数字,然后从2开始依次尝试整除这个数字:
- 若当前数字能整除用户输入的数(余数为0),就终止循环并输出该数字;
- 若不能整除,则将当前数字自增1,重复上述过程。
问题描述
如果在while循环内部声明变量num,编译时会出现“num undeclared”错误;但在循环外部(main函数的大括号内)声明num时,程序可以正常运行。请问这是为什么?
原因解释
这是C语言变量作用域的规则导致的:
- 变量的作用域指的是它能被合法访问的代码范围,C语言中用大括号
{}包裹的代码块是一个独立的作用域单元。 - 若在while循环的
{}内部声明num,这个变量的作用域仅限于循环代码块内。而你的代码里scanf("%d", &num)是在循环外执行的,此时编译器找不到num的声明,就会抛出“num undeclared”错误;即便调整scanf位置到循环内,每次循环都会重新声明初始化num,也无法实现原本的功能。 - 当在main函数的大括号内(循环外部)声明
num时,这个变量的作用域覆盖整个main函数的代码,包括while循环内部,因此scanf和循环里的num%D都能正常访问该变量,程序可正常编译运行。
内容的提问来源于stack exchange,提问作者user26419966
相关产品推荐
相关产品推荐

