#include<stdio.h>
#define N (sizeof(array) / sizeof(array[0]))
main()
{
int array[5]={1,2,3,4,5};
int d;
for(d=-1;d <= N;d++)
printf("%d\n",array[d+1]);
return 0;
}
上記のコードは何も表示していませんか?誰か教えてもらえますか?
#include<stdio.h>
#define N (sizeof(array) / sizeof(array[0]))
main()
{
int array[5]={1,2,3,4,5};
int d;
for(d=-1;d <= N;d++)
printf("%d\n",array[d+1]);
return 0;
}
上記のコードは何も表示していませんか?誰か教えてもらえますか?
有効な範囲で配列を参照するようにインデックスの有効値が評価される限り、インデックスを使用してあらゆる種類の巨大なジャンボマジックプレイを実行できます。
コードは最終的に有効なインデックス範囲に解決されます。つまり、0
to4
であり、有効です。
d+1
最初に、ループの最後の反復であるため、そのままのコードは配列の境界の外側を読み取ることに注意してください。6
有効な配列インデックスの最大値はです4
。しかし、これはコードの主な問題ではありません。現状では、の場合d = -1
、条件d <= N
は実際にはに評価されるfalse
ため、ループは反復を行わずにすぐに終了します。問題は、式の結果が sizeof(array) / sizeof(array[0])
型size_t
であり、これは符号なし整数であるのに対し、d
はint
、つまり符号付き整数であるということです。実際の比較の前に、d
はに変換されsize_t
(これはタイププロモーションと呼ばれます)、結果として大きな正の整数であるため、式d <= N
はfalseと評価されます。詳細については、このc-faqエントリを参照してください。ポイントを実際に家に帰すには、次のコードを試して、期待どおりに機能するかどうかを確認することをお勧めします。
int d = -1;
printf("%u\n", d);
size_t n = 5000;
if (d > n) printf("oops!\n");
コードの修正は非常に簡単です。たとえば、他の人が示唆しているように、ループを次のように書き直します。
for (d = 0; d < N; d++) {
printf("%d\n", array[d]);
}
動作します。
dの範囲は-1から5までなので、array[0]からarray[6] ...にアクセスします。または、の値がsizeof
タイプunsigned
である場合を除いて、-1<=Nはfalseです。
いいえ、理由:Ntはどこで定義しますか? 宣言されていない
Nt
あなたが意味していると仮定するとN
、そうです、それはうまくいくはずです。
これは印刷するのに有効な形式のように見えfor(d=-1;d <= Nt;d++)
ますが、マクロで定義したNを意味していると思います
配列はほぼ[0]から始まり、[n-1]で終わります。ここでは、配列intを使用し、d変数を宣言します。入力した配列をスタイルで印刷してから、arr[0]で開始できます。
for(d = 0; d <= array [5-1]; d ++)/ forループを宣言する/
printf( "%d"、array [d];/*配列を順番に出力します*/