为何以下C语言代码中M的输出始终为1?
问题分析与解决:变量初始化顺序错误导致的异常输出
问题根源
你这段代码的核心问题是变量初始化时机错误:
- 执行
int N,M=N;时,N是未初始化的自动局部变量,它的初始值是内存中的随机垃圾值(这次刚好是1),M此时直接复制了N的这个不确定值。 - 后续通过
scanf("%d",&N);给N赋值,只会修改N本身,不会改变已经完成初始化的M,所以M输出的始终是一开始的随机值。 - 而当你给N显式指定初始值(比如
int N=3,M=N;)时,N先被初始化,M再用N的确定值初始化,所以两者输出一致。
修正方案
要实现“让M等于用户输入的N”,需要先读取N的值,再将N赋值给M,代码调整如下:
#include<stdio.h> #include<conio.h> int main() // 遵循C标准,main函数应返回int类型 { clrscr(); int N; // 先读取用户输入的N scanf("%d",&N); // 读取完成后,再将N的值赋值给M int M = N; printf("%d",M); getchar(); return 0; }
额外说明
C语言中,函数内的自动局部变量(未加static修饰)如果没有显式初始化,其值是未定义的,访问这类变量会触发未定义行为,输出结果完全依赖当前内存状态,可能每次运行都不一样,这次输出1只是偶然情况。
内容的提问来源于stack exchange,提问作者Bhagat Singh
相关产品推荐
相关产品推荐

