2
#include<stdio.h>    
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23, 34, 12, 17, 204, 99, 16};

int main() {
    int d;

    for (d = -1; d <= (TOTAL_ELEMENTS - 2); d++)
        printf("%d\n", array[d + 1]);

    return 0;
}

forループが一度も実行されないのはなぜですか?

4

5 に答える 5

18

問題は、署名されていないsizeof()リターンです。withとsize_t比較すると、unsignedとsignedを比較したことを示す警告が表示されます。この比較が行われると、は符号なしの値に変換されます。32ビットプラットフォームでは、とは両方ともです。-1TOTAL_ELEMENTS - 2-1MAX_UINT-1MAX_UINT0xFFFFFFFF

TOTAL_ELEMENTS()マクロにキャストを組み込むことができますが、値の範囲が。よりも大きい(int)ため、技術的には正しくありません。として宣言され、負になることがないように、ループ変数を変更することをお勧めします。size_tintsize_t

于 2009-11-05T20:43:34.610 に答える
4

符号付き演算と符号なし演算を混合しています。sizeofは、size_t(符号なし型)を生成します。あなたがするときd <= (TOTAL_ELEMENTS -2)dは符号なしに変換されて、それから比較されます。-1unsignedに変換すると、ターゲットタイプの最大値になるため、条件はのようになります。0xffffffff <= 5これは常にfalseであるため、ループは実行されません。

于 2009-11-05T20:45:02.047 に答える
2

TOTAL_ELEMENTSは符号なしの値(type size_t)であり、符号付きの値(typedint、プラットフォームで署名されている可能性が高く、そうでない場合でも確実に署名されていると想定しているため)です。この場合のコンパイラはd符号なしの値に変換しており、-1を符号なしの値に変換すると、通常、SIZE_MAXまたは同様の結果になります。これは確かに。よりも大きくなりTOTAL_ELEMENTS - 2ます。これを正しく行うには、符号なしの値を符号付きの値にキャストします(int)(TOTAL_ELEMENTS - 2)

好奇心から、なぜインデックスを-1から始めて、ループ内で1を追加するのですか?なぜこれをしないのですか?

unsigned i;
for(i = 0; i < (TOTAL_ELEMENTS); i++)
    printf("%d\n", array[i]);

それはあなたが持っているものよりもはるかに明確でしょう。

于 2009-11-05T20:46:34.720 に答える
0

あなたは出来る

#define TOTAL_ELEMENTS ((int)(sizeof(array) / sizeof(array[0])))

array常に十分に小さいと仮定します。結局のところ、配列の要素をウォークスルーするために整数を使用しています。

于 2009-11-05T20:49:08.867 に答える
-2

わからない。sizeofは、ここで行うと思うことを実行しますか?int*しばらく経ちましたが、を呼び出すときのサイズを計算している可能性がありますsizeof (array)。これは1(1バイト)になります。これをintのサイズ(通常は4バイト)で割ると、ループが実行されないことを意味します。

編集:dが符号なし型に変換されている可能性が高いようです。他のポスターは正しいかもしれません。

于 2009-11-05T20:46:06.133 に答える