2017-02-21 11 views
-4

私はで次の例を見てきましたが、あなたのc(著者:Yashvant Kanetkar)をテストしました。なぜsizeof()演算子はCで異なる出力

次の例では、sizeof()は出力8です。

#include<stdio.h> 

double d; 

int main() 
{ 
(int)(float)(char)d; 
printf("%d\n",sizeof(d)); 
} 

しかし、第二の例では、sizeof()は出力4を与えます。

#include<stdio.h> 

double d; 

int main() 
{ 
printf("%d\n",sizeof((int)(float)(char)d)); 
} 

なぜ両方の出力が異なるのですか?本には何の説明もありません。

+6

'(INT)(フロート)(CHAR)D;最初の'この行は効果がありません。したがって、 'sizeof(double)'として終わります。 2番目の例では 'sizeof(int)'があります。 – DeiDei

+2

この本を投げてください。何も役に立たないことを教えているわけではありません。 –

+2

'(int)(float)(char)d;'は 'sizeof'の使用には影響しません。それは何の効果もありません。それは無意味なコード行です。合理的なCコンパイラで警告が十分に出ると、その旨のヒントが得られます。例えば、 "main.c:16:5:Expression result unused" – WhozCraig

答えて

9

最初のケースはsizeof(double)に相当します。キャストは無駄です。有効なタイプdは変更されません。適切な警告を有効にしてあなたのコードをコンパイルし、あなたには、いくつかの

警告のような警告が表示されます:効果なしとの声明を[-Wunused-値]

もう一つはキャストがあり、sizeof(int)と同等です効果的です。

ご使用のプラットフォーム/環境に基づいて結果(intまたはdoubleのサイズ)が表示されています。

  • sizeofはタイプsize_tの結果が得られ、言わ

    、あなたは結果を印刷する%zu書式指定子を使用する必要があります。

  • ホストされた環境でのmain()の適合署名は、少なくともint main(void)です。
1

最初の例では、sizeof演算子は、doubleのサイズを返します。 2番目の例では、サイズはintです。第一に理由

、第二のインスタンスにおいて

(int)(float)(char)d; //This doesn't do anything effective. 
printf("%d\n",sizeof(d)); //d is still `double`. 

//You are type casting d to float and then to int and then passing it to the operator sizeof which now returns the size of int. 
printf("%d\n",sizeof((int)(float)(float)d)); //d is `int` now when passed to `sizeof`. 
関連する問題