如果我自己不分配它,数组元素的值是多少

时间:2012-10-31 17:33:56

标签: c++ arrays

如果我写这个

会是什么结果
int array1[2];
cout << array1[0] ;

我该怎么做这个伪代码:

if array1[0] doesn't have a value then assign its value to 1  

我在DevCPP上使用C ++

5 个答案:

答案 0 :(得分:8)

array的元素是未初始化,并且在写入之前读取它们是未定义的行为。你的程序格式不正确。没有办法去检查&#34;为了这;编写正确的程序是的责任。

答案 1 :(得分:3)

未分配的数组值的初始值是未定义的(除非数组元素类型是类/结构,在这种情况下,将为每个数组元素调用默认构造函数)。在第一个示例中,由于在使用数组元素之前尚未初始化数组元素,因此行为未定义。

如果要保留“未分配”状态,则需要使用封装此类的类,例如使用值为类型的可空模式。

考虑使用Boost.Optional:您将数组声明为boost::optional<int> array1[2];,然后您可以测试if (array1[0])以查看该特定元素是否具有值。

答案 2 :(得分:3)

有一点我到目前为止看到的答案似乎已经错过了。这取决于数组的定义位置。

如果数组是函数的本地数组,例如:

int f() { 
    int array1[2];
    cout << array1[0] ;
}

...然后其他答案都是正确的:array1的内容包含未指定的值,您尝试读取该值并将其发送到cout会产生未定义的行为。

另一方面,您可能已将array1定义为全局变量:

int array1[2];

int f() { 
    cout << array1[0];
}

在这种情况下,对于任何算术类型(或指针数组为NULL),array1的内容都需要初始化为0。在这种情况下,写出array1[0]中的值是完全正确的并给出定义的结果 - 它必须为0.在这种情况下,没有任何方法可以判断包含该值的数组元素0具有该值,因为它已自动初始化为0,或稍后被赋予该值。

如果您确实需要知道某个值是否已写入变量,则可以编写一个可以执行该操作的类:

template <class T>
class value { 
     T val;
     bool assigned;
public:
     value(T const init=T()) : assigned(false), val(init) {}

     value &operator=(T const &t) { 
         assigned = true;
         val = t;
     }
     operator T() { return val; }

     bool was_assigned() { return assigned; }
};

// ...

value<int> array2[2];

if (!array2[0].was_assigned())
    array2[0] = 1;

通常通常更简单,更有效地定义类型,以便始终初始化为已知值,因此您从未真正关心它是否已分配给它。简而言之,虽然这支持了你所要求的,但我的直接反应是,可能有更好/更清洁的方法来实现你的最终目标。在你考虑使用这样的东西之前,我强烈建议退出你正在做的事情,并试图弄清楚是否有更好的方法。我的猜测是有/将会(如果你找不到它,你可能想问另一个问题,告诉我们你为什么要这样做,看看是否有人可以看到更直接的方式实现你的目标)。

答案 3 :(得分:1)

到目前为止,我记得依赖于操作系统

答案 4 :(得分:1)

正如其他用户所说,你需要初始化a然后使用for循环逐个测试每个值并修改它们,如果它们满足条件,我给你留下一个C片段:

/* Variable declaration and initialization to 0s (You can use another value as default )*/
int a[ 5 ] = { 0 };

/* If the array[ i ] has 0 as value */
for( i = 0; i < 5; i++){
   if ( a[ i ] == 0  ){ 
      a[ i ] = 1;
   }
}