C++ 理解变量范围
我对变量范围感到困惑,希望能更好地理解它 将cout赔率和cout-evenS移动到外循环。代码正确执行。如果将代码移到for循环内部,则代码将以不正确的赔率和偶数值执行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,
#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;i std::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之外,它们将不会输出正确的值。”不。变量要么在作用域内,要么不在作用域内。当你点击一个不相关的}
时,它的值不会消失。“也许我对函数返回值的方式感到困惑。”同样的故事