如果我写这个
会是什么结果int array1[2];
cout << array1[0] ;
我该怎么做这个伪代码:
if array1[0] doesn't have a value then assign its value to 1
我在DevCPP上使用C ++
答案 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;
}
}