これを書いたらどうなるか
int array1[2];
cout << array1[0] ;
そして、どうすればこの擬似コードを実行できますか:
if array1[0] doesn't have a value then assign its value to 1
DevCPP で C++ を使用しています
の要素array
は初期化されておらず、それらに書き込む前にそれらを読み取るのは未定義の動作です。プログラムの形式が正しくありません。これを「確認」する方法はありません。正しいプログラムを書くのはあなたの責任です。
割り当てられていない配列値の初期値は未定義です (配列要素の型がクラス/構造体でない限り。この場合、配列要素ごとに既定のコンストラクターが呼び出されます)。最初の例では、使用する前に配列要素を初期化していないため、動作は未定義です。
「割り当てられていない」状態を保持したい場合は、値型に null 許容パターンを使用するなど、これをカプセル化するクラスを使用する必要があります。
Boost.Optionalの使用を検討してください。配列を として宣言すると、その特定の要素に値があるかどうかをboost::optional<int> array1[2];
テストできます。if (array1[0])
私がこれまで見てきた答えが見落としているように見える点が 1 つあります。配列が定義されている場所によって異なります。
配列が次のように関数に対してローカルである場合:
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ループを使用して、各値を1つずつテストし、変更する必要があります。条件を満たしている場合は、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;
}
}
私が覚えている限り、それはOSに依存します
要素を自分で初期化しない場合、要素は現在格納されているメモリの場所から値を取得します (そして、おそらくデータ型に変換します)。このプログラムを検討してください:
#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])
など