2

如果我写这个会是什么结果

int array1[2];
cout << array1[0] ;

我该怎么做这个伪代码:

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

我在 DevCPP 上使用 C++

4

6 回答 6

8

的元素array初始化,在写入之前读取它们是未定义的行为。你的程序格式不正确。没有办法对此进行“检查”;编写正确的程序是您的责任。

于 2012-10-31T17:35:55.687 回答
3

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

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

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

于 2012-10-31T17:35:31.070 回答
3

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

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

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;

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

于 2012-10-31T18:04:54.807 回答
1

据我记得这取决于操作系统

于 2012-10-31T17:35:13.097 回答
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;
   }
}
于 2012-10-31T17:42:44.260 回答
0

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

#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]对于一些发人深省的问题,您可以检查它的内存地址并以不同的数据类型打印它。

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

于 2015-11-23T16:14:32.587 回答