int i;
int data[5] = {0};
data[0] = i;
Data [0]の値は何ですか?
また、この行の意味は何ですか?
if (!data[0]) { ... }
ほとんどの場合、int
オブジェクトには「デフォルト」値はありません。
関数内でint i;
を(非静的)ローカル変数として宣言すると、値は不確定になります。初期化されておらず、有効な値を書き込むまで使用できません。
オブジェクトを宣言するときに、オブジェクトを明示的に初期化することをお勧めします。
コードが書かれている場所によって異なります。考えてみましょう:
_int i;
int data[5] = {0};
void func1(void)
{
data[0] = i;
}
void func2(void)
{
int i;
int data[5] = {0};
data[0] = i;
...
}
_
func1()
の_data[0]
_に割り当てられた値は、完全に決定論的です。ゼロでなければなりません(他の割り当てがグローバル変数i
およびdata
の値に干渉していないと仮定します)。
対照的に、func2()
に設定された値は完全に不確定です。関数内のi
に確実に割り当てられている値がないため、_data[0]
_に割り当てられる値を確実に指定することはできません。これは、以前の関数呼び出しからスタックにあった値である可能性がありますが、コンパイラーとプログラムの両方に依存し、「実装定義」さえされていません。それは純粋な未定義の振る舞いです。
また、"これの意味は何ですか?"
_if (!data[0]) { ... }
_
'_!
_'演算子は、適用された値の論理反転を実行します。つまり、ゼロを1にマップし、ゼロ以外の値をゼロにマップします。式がゼロ以外の値と評価された場合、全体的な条件はtrueと評価されます。したがって、_data[0]
_が0の場合、_!data[0]
_は1にマップされ、ブロック内のコードが実行されます。 _data[0]
_が0でない場合、_!data[0]
_は0にマップされ、ブロック内のコードは実行されません。
これは、他の方法よりも簡潔であるため、一般的に使用されるイディオムです。
_if (data[0] == 0) { ... }
_
整数が初期化されていない場合、その値はCに従って未定義です。
整数がグローバルに宣言されている場合、ゼロで自動的に初期化されますが、ローカルの場合、何らかの値が与えられるまで、ガベージ値が含まれます
_={0};
_を含めたので、配列全体がゼロで埋められます。これが関数の外部で定義されている場合、初期化子がなくてもゼロで初期化されます。 if (!data[x])
はif (data[x] == 0)
と同等です。
//ファイル 'a.c'
#include <stdio.h>
void main()
{
int i, j , k;
printf("i = %i j = %i k = %i\n", i, j, k);
}
// 試験結果
> $ gcc a.c
> $ ./a.out
> i = 32767 j = 0 k = 0