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

what is the value of an array element if I don't assign it myself

本文关键字:数组元素 多少 分配 如果 我自己      更新时间:2023-10-16

如果我写这篇文章

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

我该如何做这个伪代码:

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

我在devcpp上使用C

array的元素是,在写信给它们之前读取它们是不确定的行为。您的程序不明显。无法"检查"此事;编写正确的程序是您的责任。

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

如果要保留"未分配的"状态,则需要使用封装它的类,例如使用可无效的模式用于值类型。

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

我看到的答案似乎已经错过了。这取决于您的数组的定义。

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

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

...然后其他答案是正确的:array1的内容包含未指定的值,您尝试读取该值并将其发送给cout的尝试提供了不确定的行为。

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

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

在这种情况下,对于任何算术类型,必须将array1的含量初始化为0(或用于指针数组的null)。在这样的情况下,写出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;

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

我记得这取决于OS

正如其他用户所说,您需要初始化 a,然后使用for loop来一个一个一个一个一个一个一个一个一个,然后对其进行修改,如果它们符合条件,我会给您一个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;
   }
}

如果您不自己初始化元素,则该元素将从现在存储的内存位置获取值(并且很可能会将其转换为数据类型)。考虑此程序:

#include <iostream>
using namespace std;
int foo(int A[])
{
    cout << A[0] << A[1];
}
int main()
{
    int array[2];
    foo(array);
}

这将给出输出00。

,但现在考虑此代码:

int main()
{
    int array[2];
    cout << array[0] << array[1];
}

它将提供一些随机的整数输出。之所以如此,是因为非初始化的数组拾取了存储在其现在占据的内存位置上的值。您可以通过&array[0]检查其内存地址,并在不同的数据类型中打印出来,以解决一些令人发指的问题。

eg: cout << &array[0] << char(array[0]) << bool(array[0])等。