C++ 理解变量范围

C++ 理解变量范围,c++,C++,我对变量范围感到困惑,希望能更好地理解它 将cout赔率和cout-evenS移动到外循环。代码正确执行。如果将代码移到for循环内部,则代码将以不正确的赔率和偶数值执行 #include <iostream> #include <vector> #include <cmath> int main() { double evenS, oddS, pH = 0; std::vector<double> v1 = {2, 4, 3,

我对变量范围感到困惑,希望能更好地理解它

将cout赔率和cout-evenS移动到外循环。代码正确执行。如果将代码移到for循环内部,则代码将以不正确的赔率和偶数值执行

#include <iostream>
#include <vector>
#include <cmath>

int main()
{
    double evenS, oddS, pH = 0;
    std::vector<double> v1 = {2, 4, 3, 6, 1, 9};

    for(int i = 0; i < v1.size(); i++)
    {
        pH = v1[i];
        if(fmod(pH, 2) == 0)
        {
          evenS = evenS + v1[i];
        }
        else if(fmod(pH, 2) == 1)
        {
          oddS = oddS + v1[i];
        }
    }

    std::cout << evenS << "\n";
    std::cout << oddS << "\n";
}
#包括
#包括
#包括
int main()
{
双偶数,赔率,pH=0;
向量v1={2,4,3,6,1,9};
对于(int i=0;istd::cout您的代码有未定义的行为(它包含一个bug),这意味着它可以做任何事情。试图分析为什么在输出周围移动语句,或者它们的[反]直观性,是没有意义的

问题在于,您的变量
evenS
赔率
没有初始化,您在写入之前读取它们的值。读取未初始化的值是错误的

您可能打算将此作为定义:

double evenS = 0, oddS = 0, pH = 0;

在声明中声明的每个变量都需要自己的初始值设定项,如果它想要有一个初始值设定项的话。

下面是对范围的解释(方括号中的注释):

作用域是程序的一个区域,广义上讲,有三个地方可以声明变量−

  • 在称为局部变量的函数或块内。[此处块指以这些括号开始和结束的代码部分
    {}
    ]
  • 在函数参数的定义中称为形式参数
  • 在称为全局变量的所有函数之外
  • 局部变量

    在函数或代码块内声明的变量是局部变量。它们只能由该函数或代码块内的语句使用。[如果您尝试在任何一个编译器外部访问,都会出现错误。]

    全局变量

    全局变量在所有函数之外定义,通常在程序顶部。全局变量将在程序的整个生命周期中保持其值

    现在就如你所说的那样

    将cout赔率和cout-evenS移动到循环外部。代码执行 如果在for循环中移动,代码将以不正确的值执行 为了胜负

    #include <iostream>
    #include <vector>
    #include <cmath>
    
    int main()
    {
        double evenS, oddS, pH = 0;
        std::vector<double> v1 = {2, 4, 3, 6, 1, 9};
    
        for(int i = 0; i < v1.size(); i++)
        {
            pH = v1[i];
            if(fmod(pH, 2) == 0)
            {
              evenS = evenS + v1[i];
            }
            else if(fmod(pH, 2) == 1)
            {
              oddS = oddS + v1[i];
            }
        }
    
        std::cout << evenS << "\n";
        std::cout << oddS << "\n";
    }
    

    如果在for循环中声明变量,其作用域将保留在该块(该循环中)。

    正如@Angew所述,您的代码中有一个bug,他建议了一个修复方法。以下主题有助于理解非斜体值:


    至于变量范围,如果您使用
    std::cout,如果您可以通过正确设置括号格式来说明范围,则会更容易。缩进是通过TAB键输入的。每个新括号都有一个TAB in。不正确。如果变量超出范围,尝试从中读取将无法编译,而不是“打印一些垃圾值”。剩下的答案只是从另一个网页复制/粘贴的一个不相关的东西是的,我的错误垃圾不应该打印,我编辑了我的答案,我修改了它来解释,甚至我也提到了参考,这就是为什么你反对它,因为我提到了参考?:)最糟糕的。哦,是的,你添加了两个小注释。但是你不能把别人的话当作你自己的话来冒充。这不好。答案中唯一的原创作品是不正确的,正如我已经解释过的那样,因此投了反对票。这个答案的当前形式在技术上不再是不正确的,但仍然是没有事实根据的。“它的范围将保持在这个范围内”这是如何回答这个问题的?它根本没有解决这个问题。谢谢你的解释。我已经改进了这段代码来正确初始化变量。我将确保在将来使用它。我的问题来自于将cout语句按赔率移动,并将其平均到一个括号中。我的印象是,如果我改变在for语句中对这些变量进行赋值,然后在for语句外对变量进行赋值,它们将无法输出正确的值。也许我对函数返回值的方式感到困惑。我相信我现在已经弄明白了。谢谢您的时间。@wiregh0st变量在其整个生命周期内都会保留其值(从创建/初始化到说明),即使控制流同时进入(并随后离开)其他作用域。@wiregh0st“我的印象是,如果我在for语句中更改这些变量,然后将这些变量放在for之外,它们将不会输出正确的值。”不。变量要么在作用域内,要么不在作用域内。当你点击一个不相关的
    }
    时,它的值不会消失。“也许我对函数返回值的方式感到困惑。”同样的故事