2017-01-18 11 views
1

以下は私が問題を抱えているコードです。私は定数を理解し、関数のsizeofを理解していると信じていますが、何かが欠けているはずです。 %dとしてTOTAL_ELEMENTSでprintf声明 - - TOTAL_ELEMENTSのprintf声明 - - それは7 を返す2 - それは(予想通り) 5を返します - 代替5にするために:ここで私は自分で解決するために何しようとしたものですループループが正しく実行される - 任意の名前のグローバルint変数を初期化し、それを(sizeof(array)/sizeof(array[0]))に設定します。 TOTAL_ELEMENTSが実行されるforループの変数を使用します。ループが正しく実行されます。Cプログラム - Sizeofと定数について一緒に使用

これは、定数とsizeof関数の両方に関係するものでなければならない - 私は配列/配列[0]も陽性だが、テストと代入を通して、問題が何であるかを理解する。私はsizeof関数だけでなく、無駄に定数を読んでいる。私は検索しようとしましたが、私が探しているものを完全には特定していないので、どこにもいませんでした。私は必ずしも答えが必要なわけではありませんが、誰かが正しい方向に私を指し示すことができれば、それは非常に高く評価されるでしょう。前もって感謝します。

#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; 
} 
+0

多分私は使用しているコンパイラです。配列のすべての要素が表示されるはずですが、実行しようとしたときに発生するのは、出力されずに実行されて終了することだけです。 – ManofManyTigers

+0

大丈夫です。私はideone.comのコードをCコンパイラ/エグゼキュータにコピーしましたが、出力されずに出力されます。しかし、元の記述に記載されているコードを変更すると、期待どおりに動作します。まだ分​​かりません。 – ManofManyTigers

+0

同じ結果が得られました...出力はありません。期待される出力を得る唯一の方法は 'int dmax =(TOTAL_ELEMENTS-2);'を割り当て、 'for(d = -1; d <= dmax; d ++)'にループを変更することです。 –

答えて

1

この問題はsizeofとは関係ありません。これは、符号なしの値で符号化された比較のためです。あなたのコードでは、(TOTAL_ELEMENTS-2)は符号なしの値を持ちますが、dは符号付きの変数です。したがって、for条件は0xFFFFFFFFと5を比較し、5は0xFFFFFFFF未満です。それは常に偽です! 例:

int main() 
{ 
    int d; 
    unsigned int e = 5; 
    for (d = -1; d <= e; d++) 
     printf("%d\n", array[d + 1]); 

    return 0; 
} 

これは印刷されません。あなたのコードと同じです。

+0

ループの 'for(d = -1; d <=(int)(TOTAL_ELEMENTS-2); d ++)'の 'int'にキャストして、符号付き比較を強制することができます。 –

+0

ありがとうございます!それは大きな助けとなりました。 – ManofManyTigers

関連する問題