C++中cin读取k前后将n赋值为k/2为何会导致运行结果不同
根因说明
- C++局部变量的初始化规则:函数内部定义的
int这类基础数据类型的局部变量,存储在栈内存中,系统不会自动为其赋初始值,变量的初始值是对应内存位置之前遗留的随机垃圾数据,读取未初始化变量的行为属于C++标准规定的未定义行为。 - 两种赋值顺序的运行差异:
n = k/2放在cin >> k之后:cin执行完成后,k已经被写入用户输入的合法有效值,此时计算得到的n是符合业务逻辑预期的数值,后续依赖n的代码(比如循环判定逻辑)可以正常执行。n = k/2放在cin >> k之前:此时k还没有被赋值,读取到的是随机垃圾值,计算得到的n也是不可预测的随机值。你遇到的无限循环输出,是因为后续代码的循环判定条件依赖n:如果随机得到的n是极大正整数,循环执行次数极多,观感上类似无限循环;如果n是负数,而循环条件是类似while(n < 目标值)这类逻辑,就会永远满足循环条件,触发真正的无限循环。
- 最佳实践:定义局部变量时同时完成初始化,比如修改为
int n = 0, k = 0;,可以彻底避免未初始化垃圾值带来的各类异常问题。
涉事代码示例:
#include <iostream> using namespace std; int main () { cout<< "how many asterisks you want in the middle column:"; int n,k; // 此处n、k均为未初始化的垃圾值 // n=k/2 ; 此处赋值时k还是垃圾值,计算得到的n也异常 cin>>k; // 此处k被覆盖为用户输入的有效值 // n=k/2; 此处赋值使用有效k值,n符合预期 //some code involving n return 0; }
内容的提问来源于stack exchange,提问作者bbahd
相关产品推荐
相关产品推荐

