即使只有主函数,在主函数外部声明变量也会改变输出

Posted

技术标签:

【中文标题】即使只有主函数,在主函数外部声明变量也会改变输出【英文标题】:Declaring a variable outside main function changes output even though there is only main function 【发布时间】:2020-04-29 04:13:06 【问题描述】:

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

【问题讨论】:

在全局范围内声明的变量与在本地范围内初始化的变量不同。我建议始终通过int mis = 0, chr = 0 初始化您的变量,这样就很清楚了。您是否还在code here 循环期间修改了mischr 我第二个 Tas。此外,这可能是一个明显的建议,但您是否尝试在 if 语句之前输出两个变量的值,以检查发生了什么? @Tas 是的,我确实在此处的代码部分修改了 mis 和 chr 的值。 仅供参考:SO: Uninitialized variable behaviour in C++ 可能存在您未发布的代码中的错误。最好复制并粘贴您的真实代码(以及您提供的输入) 【参考方案1】:

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

还有

"未初始化的变量带来未定义的行为"

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

int main() 

    int mis = 0, chr = 0;
    // ...

    return 0;

现在让我们来看看你的节目吧:

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

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

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

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

【讨论】:

这也是我最初的想法,但他们说他们的截断代码确实设置了值,并且他们通过在条件句之前输出它们来检查它们并且它们是正确的。不过,在声明时初始化所有内容仍然是个好主意。 如果它解决了您的问题,请不要忘记点赞并接受。【参考方案2】:

我尝试了您的代码,在这两种情况下它对我来说都是一样的。 所以,我会说它随着编辑器的变化而变化,并且总是在使用它之前初始化变量。 否则,我们可能会遇到与您相同的问题。因为它用垃圾值初始化变量。

【讨论】:

编辑器(您在其中编写程序)可能对未初始化局部变量的未定义行为影响最小。无论您是在 Notepad++、VisualStudio 中还是在 shell 中使用 cat 编写此代码,它都是未定义的行为。 ;-)

以上是关于即使只有主函数,在主函数外部声明变量也会改变输出的主要内容,如果未能解决你的问题,请参考以下文章

C语言函数声明是要在主函数内部还是外部啊?

结构体联合体

如何从外部函数 C++ 访问动态结构?

Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

程序通过定义学生结构体变量,存储学生的学号姓名和3门课的成绩。函数fun的功能是:对形参b所指结构体变量中的数据进行修改,并在主函数中输出修改后的数据。

matlab怎么在主函数中调用子函数计算出来的值