我刚刚开始学习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吗?我做错了什么?
答案 0 :(得分:4)
未分配任何值的局部变量具有所谓的Indeterminate Value(也称为垃圾值,它是先前存储在该内存位置的值(在c和c ++中))并访问未初始化的变量导致未定义的行为。
如果您没有为它们分配值,它们将具有垃圾值。
但是static
和全局变量的默认值为0
答案 1 :(得分:3)
http://en.cppreference.com/w/cpp/language/default_initialization
默认初始化在以下三种情况下执行:
1)当a 具有自动,静态或线程本地存储持续时间的变量 声明没有初始化程序。
2)当一个对象具有动态存储空间时 持续时间是由一个没有初始化程序的new-expression创建的 object由包含初始化程序的new-expression创建 一对空括号(直到C ++ 03)。
3)当一个基类或 构造函数初始值设定项中未提及非静态数据成员 list和那个构造函数被调用。
默认初始化的效果是:
如果T是非POD(直到C ++ 11)类类型,则考虑构造函数并对空进行重载解析 参数列表。选择的构造函数(这是默认值之一 调用构造函数来为新的提供初始值 对象
如果T是数组类型,则数组的每个元素都是默认初始化的。
否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定 值。强>
答案 2 :(得分:0)
访问未初始化的变量将导致undefined behavior。另请参阅this answer。
你需要初始化&#39;在执行加法赋值之前s + = plotas((x2-x1),(y2-y1))。
答案 3 :(得分:0)
简单地初始化变量以防止它们假设任何垃圾值:
int p=0, a=0,n=0,x1=0,x2=0,y1=0,y2=0,s=0,s1=0;
您也可以根据代码需要将其初始化为int
以外的任何0
。