变量在声明后具有值

Variables have values after declaring them

本文关键字:声明 变量      更新时间:2023-10-16

我刚开始学习c++,遇到了一个小问题。在声明变量之后,将为其分配值。

#include <iostream>
#include <fstream>
using namespace std;
ifstream d ("d.txt");
ofstream r ("r.txt");
int plotas (int a, int b);
int main()
{
int p,
a,
n,
x1,
x2,
y1,
y2,
s,
s1;
d >> p >> a;
d >> n;
for(int i =0; i < n; i++){
d >> x1 >> y1 >> x2 >> y2;
s+= plotas((x2-x1), (y2-y1));
}
s1= plotas(p, a)- s;
cout << s1;
}
int plotas (int a, int b){
return a*b;
}

例如,变量s为1967866170。它们不应该都是0吗?我做错了什么?

未分配任何值的局部变量具有所谓的不确定值(也称为垃圾值,它是以前存储在该内存位置(在c和c++中)的值),访问未初始化的变量会导致未定义的行为。

如果不给它们赋值,它们将具有垃圾值。

static和全局变量的默认值为0

http://en.cppreference.com/w/cpp/language/default_initialization

默认初始化在三种情况下执行:

1)当具有自动、静态或线程本地存储持续时间的变量为声明时没有初始化项

2) 当具有动态存储的对象duration由不带初始值设定项的新表达式创建,或者当对象是由一个新表达式创建的,初始值设定项由(直到C++03)。

3) 当基类或构造函数初始值设定项中未提及非静态数据成员列表,然后调用该构造函数。


默认初始化的效果是:

如果T是非POD(直到C++11)类类型,则考虑构造函数,并对空进行重载解析参数列表。所选的构造函数(它是默认的构造函数之一构造函数)来为新的对象

如果T是数组类型,则默认初始化数组中的每个元素。

否则,将不执行任何操作:具有自动存储持续时间的对象(及其子对象)将初始化为不确定值

访问未初始化的变量将导致未定义的行为。另外,请参阅此答案。

在执行加法赋值s+=plotas((x2-x1),(y2-y1))之前,需要初始化"s"。

只需初始化变量以防止它们假设任何垃圾值:

int p=0, a=0,n=0,x1=0,x2=0,y1=0,y2=0,s=0,s1=0;

您还可以根据代码的需要将它们初始化为除0之外的任何int