c++ - 即使只有主函数,在主函数外部声明变量也会改变输出
问题描述
所以我一直在研究一个问题,这个想法偶然出现在我身上。当我在主函数之外声明一个变量时,程序正常工作,即它达到“友谊就是魔法”的 else 情况,但如果在内部声明变量,它返回 Chris 而不是 Friendship 语句。
int mis, chr;
int main() {
int a, n, m;
cin >> a;
for (int i = 0; i < a; i++) {
//code here
}
if(mis > chr)
cout << "Mishka";
else if(chr > mis)
cout << "Chris";
else
cout << "Friendship is magic!^^";
}
我正在使用的输入使 chr 和 mis 的值相等,因此它应该对 else 语句进行评估,但它只是在 else if 处停止。
解决方案
“强大的力量(由 C++ 提供)也必然伴随着巨大的责任”
和
“随着未初始化的变量而来的是未定义的行为”
在全局范围内声明的变量由编译器初始化。但是,在任何函数中定义的变量(即具有自动存储)可能包含垃圾值(在程序的每次调用中可能不同)。我建议始终将变量初始化为某个值。
int main()
{
int mis = 0, chr = 0;
// ...
return 0;
}
现在让我们来看看你的程序:
当我在主函数之外声明一个变量时,程序正常工作,即它达到了“友谊就是魔法”的其他情况
发生这种情况是因为变量(您的 if 梯子依赖的变量)被初始化为0
. 由于两个变量具有相同的值 ( 0
),因此 if 语句的 else 部分正在执行。
但如果变量在内部声明,则返回 Chris 而不是 Friendship 语句。
这是未定义行为的完美示例。如果它们是在您的函数中定义的,它们将持有一些垃圾值,并且可能不相等。因此,您所观察到的是一种未定义的行为,您可能会在不同的机器甚至有时在同一台机器上得到不同的结果。
推荐阅读
- angular - 为什么没有完整部署的 Angular Firebase Cloud Functions Emulator 不会更新函数?
- apache-spark - SparkSQL 无法将数据放入内存
- xamarin - 如何将 MVVMCross6 与 Xamarin.Forms 一起使用
- ruby-on-rails - ActiveAdmin - 如何通过 AJAX 向表单提交按钮发送 http 请求
- mysql - 选择我所属的所有组并显示这些组的成员
- c# - 在 Unity 中自动为脚本添加自定义编辑器的快捷方式
- angular - 如何使用 Angular 2 中的指令在宿主元素上设置计算宽度
- java - 如何防止 proguard 从输出 jar 中删除“module-info.class”?
- android - 如何使用 FileProvider 在内部存储/缓存中创建和显示 PDF?
- amazon-web-services - 使用 JavaScript 开发工具包 --no-include-email 标志的 AWS ECR 登录