電子書籍の厳選無料作品が豊富!

C言語でダブルクォートで囲まれた文字列内で使われる、「\」で始まるエスケープシーケンスがありますよね。例えば、

「\n」 ⇒ 改行
「\t」 ⇒ タブ
「\"」 ⇒ ダブルクォート
「\\」 ⇒ バックスラッシュ

などですが、C言語のリフェレンスを見ると「\'」(シングルクォート)や「\?」(クエスチョンマーク)なども載っていました。でもこれらの文字は、実際はエスケープシーケンスを使わなくても、ちゃんとコンパイルされ表示もされます。

「'」や「?」をC言語の文字列内で使うには、公式には「\」が必要なんでしょうか?

A 回答 (4件)

\? のほうは、今となっては悪名高い、「トライグラフ」に関連したものです。


Cでよく使われる記号で、{ } | # \ などの記号は、実は、各国で文字コードが結構ばらばらです。(バックスラッシュが、JIS では \ になってしまうのは、我々にはなじみが深いですが)

さて、それを避けるために、?? + 1文字で、上記の文字を代用することができます。
具体的には、URL をどうぞ。
今でもこの仕様は有効なので、??なんとか とすると、訳のわからないエラーに見舞われることがあります。
(gcc はデフォルトで OFF らしい)

これの対策で、明示的に ?? と、2連発したいときなど、 \?\? が安全なのかもしれません。

参考URL:http://rec.ncos.co.jp/cgi-bin/e000.cgi?64
    • good
    • 0
この回答へのお礼

トライグラフの存在を初めて知りました。サイトも参考になりました。ありがとうございました。

お礼日時:2008/02/29 07:53

★回答者No.2です。


・ちょっと訂正。
 『??=』の3文字で『#』文字でした。
 失礼しました。
    • good
    • 1

★アドバイス


>「\?」は「仕様上、そうなっている」だけです。
>「?」単独で書いても「?」と解釈される部分では「?」と書いて構いません。
 ↑
 『三連文字』対策のため。
 例えば
 printf( "??=あ\n" );
 とすると『??』が三連文字と解釈されて『#』となります。
 よって実際に『??=あ』と表示するには
 printf( "\?\?=あ\n" );
 とします。このような場合に『\?』は利用されます。
    • good
    • 0
この回答へのお礼

トライグラフの存在を初めて知りました。ありがとうございました。

お礼日時:2008/02/29 07:52

「\'」は


char c = '\'';
と書く場合に必要です。

「\?」は「仕様上、そうなっている」だけです。「?」単独で書いても「?」と解釈される部分では「?」と書いて構いません。
    • good
    • 0
この回答へのお礼

そう言えばcharの方では絶対必要ですね。ありがとうございました。

お礼日時:2008/02/29 07:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!