2017-02-18 8 views
0

次のコードは何も出力しない:異なる出力を生成マクロで2つの同様のCプログラム

#include<stdio.h> 
#define TOTAL_SIZE ((sizeof(array))/(sizeof(array[0]))) 
int main() 
{ 
    int array[]={1,2,3}, d; 
    for(d=-1; d<=TOTAL_SIZE-2; ++d) 
    { 
     printf("%d\n", array[d+1]); 
    } 
    return 0; 
} 

D = -1 < = 3-2
プリントアレイ[-1 + 1]配列[0]
D = 0 < = 3-2
プリントアレイ[1]
D配列[0 + 1] = 1 < = 3-2
プリントアレイ配列である[1 + 1] [2]

しかし、単一の要素は印刷されません!



しかし、このコードは、配列のすべての要素を印刷する右の出力を生成します。

#include<stdio.h> 
#define TOTAL_SIZE ((sizeof(array))/(sizeof(array[0]))) 
int main() 
{ 
    int array[]={1,2,3}, d; 
    for(d=0; d<=TOTAL_SIZE-1; ++d) 
    { 
     printf("%d\n", array[d]); 
    } 
    return 0; 
} 

しかし、ループの両方の正味の効果は同じように見えます。

マクロのTOTAL_SIZEを配列の要素数で置き換えると、それは機能します。したがって、問題はマクロにあるように見えます。

しかし、TOTAL_SIZEによって生成された値を印刷しようとすると、正しい値が印刷されます。

最初のプログラムの問題点は何ですか?

+4

すべての警告を有効にして、エラーとして処理します。それは正気のままにする唯一の方法です。 gccとclangについては、 '-Wall -Wextra -Wpedantic -Werror'です。 –

答えて

8

マクロの問題はsizeofあなたがに比較している符号なし整数タイプはintを締結しているsize_tを返すということです。解決方法は、サイズをintにキャストすることです。

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

+2

Nitpickでは、実装で定義された符号なし整数型である 'size_t'を返しますが、必ずしも** unsigned int型ではありません。 – StoryTeller

+0

はい、size_tは*符号なし*です。修正のおかげで:) – Micha

+0

私の問題は、dの最初の値(つまり、符号付きの数値、-1)をsizeofによって返されたsize_tと比較していました。助けてくれてありがとう。 –

関連する問題