如果我写这个会是什么结果
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;
将类型定义为始终初始化为已知值通常更容易和更有效,因此您永远不会真正关心它是否被分配。简而言之,尽管这支持您的要求,但我的直接反应是,可能有更好/更清洁的方式来实现您的最终目标。在你甚至考虑使用这样的东西之前,我强烈建议你退出你正在做的事情,并尝试找出是否有更好的方法来做到这一点。我的猜测是有/将会有(如果你找不到它,你可能想问另一个问题,告诉我们你为什么要这样做,看看是否有人可以看到更直接的方法完成你的目标)。
据我记得这取决于操作系统
正如其他用户所说,您需要初始化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;
}
}
如果您不自己初始化元素,则元素将从现在存储的内存位置获取值(并且很可能会将其转换为其数据类型)。考虑这个程序:
#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])
等。