-2
#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;
}

上記のコードは何も表示していませんか?誰か教えてもらえますか?

4

7 に答える 7

1

有効な範囲で配列を参照するようにインデックスの有効値が評価される限り、インデックスを使用してあらゆる種類の巨大なジャンボマジックプレイを実行できます。

コードは最終的に有効なインデックス範囲に解決されます。つまり、0to4であり、有効です。

于 2012-06-19T08:13:51.730 に答える
1

d+1最初に、ループの最後の反復であるため、そのままのコードは配列の境界の外側を読み取ることに注意してください。6有効な配列インデックスの最大値はです4。しかし、これはコードの主な問題ではありません。現状では、の場合d = -1、条件d <= Nは実際にはに評価されるfalseため、ループは反復を行わずにすぐに終了します。問題は、式の結果が sizeof(array) / sizeof(array[0])size_tであり、これは符号なし整数であるのに対し、dint、つまり符号付き整数であるということです。実際の比較の前に、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]);    
}

動作します。

于 2012-06-19T10:32:51.833 に答える
1

dの範囲は-1から5までなので、array[0]からarray[6] ...にアクセスします。または、の値がsizeofタイプunsignedである場合を除いて、-1<=Nはfalseです。

于 2012-06-19T10:33:43.287 に答える
0

いいえ、理由:Ntはどこで定義しますか? 宣言されていない

于 2012-06-19T08:13:57.240 に答える
0

Ntあなたが意味していると仮定するとN、そうです、それはうまくいくはずです。

于 2012-06-19T08:14:40.663 に答える
0

これは印刷するのに有効な形式のように見えfor(d=-1;d <= Nt;d++)ますが、マクロで定義したNを意味していると思います

于 2012-06-19T08:15:24.680 に答える
0

配列はほぼ[0]から始まり、[n-1]で終わります。ここでは、配列intを使用し、d変数を宣言します。入力した配列をスタイルで印刷してから、arr[0]で開始できます。

for(d = 0; d <= array [5-1]; d ++)/ forループを宣言する/

printf( "%d"、array [d];/*配列を順番に出力します*/

于 2012-06-19T08:46:39.467 に答える