2010-12-31 8 views
6

CまたはC++でchar c[99] = {'Stack Overflow'};と書いてみましょう。これはうまくコンパイルされますが、これは有効ですか?有効では、私は未定義または不特定の動作を呼び出さないことを意味しました。有効なCステートメントですか?

もう一度char c[99] = 'Stack Overflow';と書いても、gccは多角形定数について不平を言いますが、上記の中括弧で囲んでいるとコンパイラは満足です!それはなぜそうですか?

最初の文の後のputs(c);は、一般的な文字列の最後の文字を正確にStack Overflowと出力します。なぜそうなのか?

誰かがこれらの動作を個別に説明できますか?

+3

コンパイルして調べる。 – Falmarri

+5

彼はすでに彼がそれをコンパイルしたと言いました... – indiv

+22

@Falmarri:私はあなたがRTFQ賞に勝つと思います。彼は「それはうまくコンパイルされている」と言って、その出力についても説明しましたが、明らかにテストしました。しかし、テストでは、ポータブルであるか、標準によって明確に定義されているかはわかりません。 –

答えて

14

これらはどちらも単なるリテラルなので、c[0]はリテラルに設定され、c[1] ... c[98]はゼロ(NUL文字)で埋められます。

c[0]に実際にどのような値が埋め込まれているかは、実装に依存しますが、少なくとも互換性のあるコンパイラでコンパイルする必要があります。

EDIT:少なくともC++ 0Xで、標準に対して確認:

複数文字リテラルはintと実装定義の値を入力しています。

とC99で(それは無料です原因、the draftを使用して):

1つの文字(例えば、 'ab')以上を含む、または文字またはエスケープシーケンスを含む整数文字定数の値実行文字が1バイトの にマッピングされていない場合は、実装が定義されています。

+1

+1マルチチャーターリテラルの世界へようこそ –

+0

しかし、なぜ中かっこ付きのステートメントはコンパイラの構文チェックに合格しますか? – Quixotic

+1

@Philando:コンパイルイニシャライザは複数の要素を持たなければならないというルールはありません。実際int [10] = {0};のようなものは非常に一般的です –

1

合意 - Windowsカーネルコードでは、たくさんのタグメモリがあります。実際にはプラットフォームごとに実装されています。しかし、彼らはULONGを使ってメモリにタグを付け、それは常に逆の順序で4文字のリテラルです。 ULONG tagMemory = 'kscf';

解釈はプラットフォーム固有ですが、文字列です。

関連する問題