2012-01-02 10 views

答えて

4

何らかの理由でこれを正当化する1つの(恐らくさらに極端な)奇妙さは、文字リテラルがではなく、が1文字に限定されているという事実です。

このお試しください:例えばを扱うときにこれが便利な場合があり

printf("%d\n", 'xy'); 

PNGなどの32ビットの「チャンク」識別子を使用するバイナリファイル形式。あなたはこのようなものを行うことができます。

const int chunk = read_chunk_from_file(...); 
if(chunk == 'IHDR') 
    process_image_header(...); 

もちろん上記のスニペットはread_chunk_from_file()が魔法で見つかったビッグエンディアンの32ビット値を変換するために正しいことをしていることを前提とし、しかし、このようなコードを移植性の問題があるかもしれませんPNGファイルを対応する複数文字の文字リテラルの値と一致するものに変換します。

+1

+1「IHDR」はすべてのプラットフォームで同じものになりますか? – cnicutar

+0

@cnicutar:C標準では、それは完全に実装定義です。 gccはそれをすべて同じにします。 (同じ**値**、同じ表現ではありません...) –

+0

@cnicutar:私はそうではないと思います...それで、私は 'read_chunk_from_file()'についてスマートにする必要がある部分を書きましたこの使用法をサポートする。 – unwind

16

C文字の定数はintであり、charではないためです。だからsizeof('c') == sizeof(int)。おそらく、驚くほど、Cで文字定数は、(これはC++ 異なり、別の領域であるが)ので はsizeof( 'A')ははsizeof(int型)で、int型のこのC FAQ

を参照してくださいです。単一引用符の間に書かれた文字に関してKernighan & RitchieによってThe C programming Language -

+1

うわー、あなたは毎日新しいものを学びます。このようなCの狂った小さな奇妙なことを愛してください。 –

1

以下は、有名なC本からの有名なラインです。

一重引用符で囲まれた文字は、マシンの文字セット内の文字の数値に等しい整数値を表します。

だからsizeof('a')sizeof(int)

に相当し、この質問は完全に右のコースですwhy sizeof('a') is 4 in C?

+3

このK&R文は、文字定数がCの型int型であるという事実とは関係がありません。 'char'、' short'または '_Bool'も整数です。 – ouah

+0

@ouah最初の声明を詳しく述べてください。リストに 'enum'を追加することができます! –

1

cnicutarの複製です。私はちょうどこれの理由を追加したかった。関数行fgetcを見ると、intを返すことに気付くでしょう。これは、charが0x00から0xFFまでの任意の文字を表すことができるためですが、EOFを表すためには追加の値が必要です。だから、入力やファイルから文字を返す関数はintを返すことが多く、EOFと比較することができます。これは通常-1と定義されていますが、それは有効な文字ではありません。

+0

実際に 'EOF'は負でなければならないので、' int'の幅が 'CHAR_BIT'と同じでない限り、* unsigned * charの値が' int'に変換されてしまう可能性があります。 –