首页 > 解决方案 > 即使只有主函数,在主函数外部声明变量也会改变输出

问题描述

所以我一直在研究一个问题,这个想法偶然出现在我身上。当我在主函数之外声明一个变量时,程序正常工作,即它达到“友谊就是魔法”的 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++gccc++17

解决方案


强大的力量(由 C++ 提供)也必然伴随着巨大的责任

随着未初始化的变量而来的是未定义的行为

在全局范围内声明的变量由编译器初始化。但是,在任何函数中定义的变量(即具有自动存储)可能包含垃圾值(在程序的每次调用中可能不同)。我建议始终将变量初始化为某个值。

int main() 
{
    int mis = 0, chr = 0;
    // ...

    return 0;
}

现在让我们来看看你的程序:

当我在主函数之外声明一个变量时,程序正常工作,即它达到了“友谊就是魔法”的其他情况

发生这种情况是因为变量(您的 if 梯子依赖的变量)被初始化为0. 由于两个变量具有相同的值 ( 0),因此 if 语句的 else 部分正在执行。

但如果变量在内部声明,则返回 Chris 而不是 Friendship 语句。

这是未定义行为的完美示例。如果它们是在您的函数中定义的,它们将持有一些垃圾值,并且可能不相等。因此,您所观察到的是一种未定义的行为,您可能会在不同的机器甚至有时在同一台机器上得到不同的结果。


推荐阅读