質問: エスケープ文字についてよくわからないのですが、 バックスラッシュなどを表現する場合に「¥¥」のように表現しているのですが、 「エスケープ文字」としてきまった文字があるのでしょうか? ここなどをみると「C言語のエスケープ文字」とあり、 言語によって異なるものなのでしょうか?
回答: エスケープ文字およびエスケープシーケンスは、各種言語において「文字」あるいは「文字列」の中で、ソースコードの見た目と違う機能を引き出す処理と考えていいでしょう。 んで [c](/questions/tagged/c "'c' のタグが付いた質問を表示") も [java](/questions/tagged/java "'java' のタグが付いた質問を表示") も [python](/questions/tagged/python "'python' のタグが付いた質問を表示") あるいは [ruby](/questions/tagged/ruby "'ruby' のタグが付いた質問を表示") も、エスケープ文字として逆斜線文字を採用し、エスケープシーケンスも似通っています(同一でないので要注意:各言語の仕様書なり解説書なり参照のこと)何か理由なり根拠なりありそうです。 これは妄想ですが、各種言語は、古くからある [c](/questions/tagged/c "'c' のタグが付いた質問を表示") 言語のユーザーを自分の陣営に取り込みやすくするため、移行中の [c](/questions/tagged/c "'c' のタグが付いた質問を表示") ユーザーが混乱しないよう [c](/questions/tagged/c "'c' のタグが付いた質問を表示") 言語に似せたエスケープ文字(エスケープシーケンス)を採用したと個人的には思います。なので、エスケープ文字として「決まった文字」があるわけではないけれど、わざわざ独自の仕様を採用して皆を混乱させるくらいならほぼ同じものにしてしまおうという暗黙の合意があったのではないか、と考えることはできそうです。 そういう事情に関係ない `cmd.exe` や `PowerShell` のエスケープは文字もシーケンスも異なります。 [c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") においてはエスケープシーケンスに似て非なる「トライグラフ」というのがあり、文字(列)リテラルでないところでもソースコード上に「クエスチョンマーク2つ+特定文字」があると、別の文字に読み替えるという変態な機能が盛り込まれています(いやもちろん採用された根拠はきっちりあるのですが)。 ``` ??=define arraycheck(a,b) a??(b??) ??!??! b??(a??) // と記述すると #define arraycheck(a,b) a[b] || b[a] // と読む ``` これを知らないプログラマが [c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") でうっかり `??` を書いてしまうとバグらせてしまうことがありうるので要注意です。 これのせいで [c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") のエスケープシーケンスには `\?` が存在します(ほかの言語には無いはず) [gcc](/questions/tagged/gcc "'gcc' のタグが付いた質問を表示") では標準で無効、コンパイルオプション `-trigraphs` で有効化したら使えるようになる機能なうえに `-Wtrigraphs` で警告されるほど嫌われていました。また [c++17](/questions/tagged/c%2b%2b17 "'c++17' のタグが付いた質問を表示") では廃止になっちゃいました。