了解可变范围

wir*_*0st 2 c++

我对可变范围感到困惑,并希望更好地理解它。

将cout奇数和coutevenS移到外部进行循环。代码正确执行。如果将其移入for循环,则代码将以不正确的odds和evenS值执行。

#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";
}
Run Code Online (Sandbox Code Playgroud)

我期望如果在for循环之外递增,odds和evenS不会保持适当的值。但是,事实恰恰相反,这引起了我的困惑。

Rei*_*ica 5

您的代码具有未定义的行为(它包含一个错误),这意味着它可以执行任何操作。试图分析为何围绕更改输出移动语句或它们的[反-]直观性没有多大意义。

问题在于您的变量evenSoddS未初始化,并且您在写入变量之前先读取它们的值。读取未初始化的值是UB。

您可能打算将其写为定义:

double evenS = 0, oddS = 0, pH = 0;
Run Code Online (Sandbox Code Playgroud)

如果要在声明中声明的每个变量都具有自己的初始化程序,则它需要自己的初始化程序。