我对可变范围感到困惑,并希望更好地理解它。
将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不会保持适当的值。但是,事实恰恰相反,这引起了我的困惑。
您的代码具有未定义的行为(它包含一个错误),这意味着它可以执行任何操作。试图分析为何围绕更改输出移动语句或它们的[反-]直观性没有多大意义。
问题在于您的变量evenS和oddS未初始化,并且您在写入变量之前先读取它们的值。读取未初始化的值是UB。
您可能打算将其写为定义:
double evenS = 0, oddS = 0, pH = 0;
Run Code Online (Sandbox Code Playgroud)
如果要在声明中声明的每个变量都具有自己的初始化程序,则它需要自己的初始化程序。