变量在声明后具有值

时间:2015-04-27 16:57:39

标签: c++

我刚刚开始学习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吗?我做错了什么?

4 个答案:

答案 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