アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミング初心者です。

早速ですが現在、C言語入門書に目を通している最中なのですが理解出来ない部分が有ります。
内容としましては 「エスケープ文字」 に関してです。本書ではあまり理解出来なかったのでネットで検索していると、「エスケープシーケンス」 と言う用語も数多く出てきました。

いろいろ検索し私なりに出した答えは.....
•エスケープ文字 = 文字が持つ特別な意味を無効にする為の文字。
•エスケープシーケンス = 改行などの特殊な文字を英数字の組み合わせで表現した物。

と....上記の様に私は理解しているのですが現在読んでいるC言語入門書の内容だとエスケープ
シーケンスと考えられる説明が 「エスケープ文字」 として記述されています。
それはC言語ならではの扱い方なのか?、本書の内容が間違っているのか?


分かりづらい説明だと思うのですがよろしくお願いいたします。

因に現在読んでいる入門書は 「読本C-C言語徹底攻略」 と言う本でかなり昔のになります。 

A 回答 (10件)

No9です。

一部訂正です。

エスケープ文字 = 特殊な意味を持つ文字(制御文字等)の直前に記載することによりその意味を無効にする文字、もしくは、直前に記載することによって通常の文字を特殊な用途として利用できるようにする文字。
    • good
    • 1
この回答へのお礼

お返事が遅れてしまい申し訳ありません。

丁寧に受け答えしてくださり本当にありがとうございます。非常に助かりました。少々、深く考えすぎたようです。

詳細も含め助かりました。ありがとうございました。

お礼日時:2014/06/22 17:24

> では回答者様が提示した上記リンク先内容の「エスケープ文字」の概念はC言語では存在しないと言う事でしょうか?



いえ、そうではありません。ちゃんと存在します。たまたま、同じようなことが書かれていたので、これを見たのかなと思っただけですので深い意味で紹介したわけではありません。

> もしそうでない場合、「\n」は「エスケープ文字」と「エスケープシーケンス」意味が混同してしまうと思います。

そうなんです、混同して使う方がいらしゃるので現実はややこしい事になっているのですね。

本来の意味としてはinput_outputさんの理解であっています。ただ

エスケープ文字 = 文字が持つ特別な意味を無効にする為の文字。

こう書くと誤解される表現になってしまいます。この文章について、違うよと回答されている方は誤解されてるのだと思います。

エスケープ文字 = 特殊な意味を持つ文字(制御文字等)の直前に記載することによりその意味を無効にする文字

とうことですよね。エスケープ文字をエスケープ文字として認識させないために直前にエスケープ文字を記載する状態。

今読まれている解説書が、エスケープ文字とエスケープシーケンスを同じとして解説しているのでしたら、本来は間違っていますが、同じ意味で使われていると考えてお読みになるとよろしいかと思います。ただ、あちらこちらで意味が本来の意味として解説していたり混同して解説していたりするのでしたら、別の解説書に変更したほうが頭が痛くならなくてすみます。
    • good
    • 0

C の規格において, 「エスケープ文字」というものは索引にしか存在しません (なぜか本文には出てこない). そして, その実態はバックスラッシュです.



で「そのエスケープ文字を先頭において特殊な意味を持たせたもの」が「エスケープシーケンス」.
    • good
    • 0
この回答へのお礼

お返事が遅れてしまい申し訳ありません。

丁寧に回答して頂きありがとうございます。
とても助かりました。

お礼日時:2014/06/22 17:09

#4の方へ



OSや処理系などによるのかもしれませんがunix系やWindowsでは
復帰 0x0d
改行 0x0a
であり、Cコンパイラが"\n"を変換する際には改行の0x0aになります。
0x0aの前に0x0dが付加されるのはまた別の所です。
    • good
    • 0

>下記リンク先にて引用しました。


>http://wa3.i-3-i.info/word11732.html
>
>もし、C言語と他の言語では「エスケープ文字」に関しての定義が異なるのであれば同義語と言う形で納得出来るのですが.....

そのリンク先には

>エスケープ文字とは
>そいつを前に置くと特別な意味が無効になるよ、な文字のこと。
>あるいは
>エスケープシーケンスとして認識させるための文字のこと。
>です。

と2つの意味で書かれていますけど、その一方だけ引用されているのは何故でしょうか。

私がエスケープ文字を説明するなら

・次の文字の意味を通常とは異なる意味に変える文字(ただし「文字の通常の意味」は言語などにより異なる)

になるかと思います。

例えばC言語のリテラル文字列は文字"で前後を挟んだ形"~"で表されますが、最初の"をリテラル文字列の開始し文字を順に解釈していくとするならば、
文字"は通常の意味では文字列の終端ですがエスケープ文字を前に置くことで文字"そのものに意味が変わります。
文字\は通常の意味ではエスケープ文字ですがエスケープ文字を前に置くことで文字\そのものに意味が変わります。
文字nは通常の意味では文字nそのものですがエスケープ文字を前に置くことで改行文字に意味が変わります。

正規表現だと
文字.は通常の意味では任意の1文字ですがエスケープ文字を前に置くことで文字.そのものに意味が変わります。
    • good
    • 0
この回答へのお礼

お返事が遅そくなり申し訳ありません。

丁寧に回答してくださりとても助かりました。
ありがとうございました。

お礼日時:2014/06/22 17:13

>•エスケープ文字 = 文字が持つ特別な意味を無効にする為の文字。



これが間違いの元ですね。真逆です。

エスケープ=文字が持つ本来の意味と異なる別の意味を与えること

です。n は本来の意味はアルファベットのエヌなわけですが、\n でエヌと異なる改行の意味になったりします。
\n は2文字ですが、もっと多くの文字列に別の意味を与えることもあるので、一般的にはエスケープシーケンスと呼びます。例えば、Unix/Linuxで使われる一般的な端末の画面クリアは、Cの文字列表記で表すと "\E[2J" というエスケープシーケンスです。

ちなみに、「文字が持つ特別な意味を無効にすること(文字の本来の意味として扱わせること)」を引用とかクォートと言います。ただし、ややこしいことに、クォートとエスケープは混同されて使われることがほとんどです。
    • good
    • 0
この回答へのお礼

お返事が遅くなってしまい申し訳ありません。

丁寧に回答して頂きとても助かりました。
ありがとうございました。

お礼日時:2014/06/22 17:15

エスケープ文字は次くる文字の意味を変える。

エスケープ文字と次の文字の組がエスケープシーケンスという理解でいいと思います。意味の変え方は処理系によって異なる事はあり得ます。¥nがNew Lineなどは一般的ですが。Cコンパイラーは¥nを見つけると0x0D0Aという文字コードに変換し、テレタイプは改行と一行の紙送りを行うなどです。テレタイプをエミュレートする表示ドライバーは改行と次行へのカーソル移動を行う。こんな感じです。
で¥¥ですが¥そのものを出力したい場合は¥一つだと次の文字と一緒にしてエスケープシーケンスと理解されてしまいます。¥を出力したい場合は¥¥と書く訳です。
なお定義されていないエスケープシーケンスがあると¥の文字が無視され(すなわち取れ除かれ)ます。
    • good
    • 0
この回答へのお礼

お返事が遅れてしまい申し訳ありません。

詳細も含め丁寧に回答して頂きありがとうございました。

お礼日時:2014/06/22 17:17

その解説書ではどちらも同じ意味(エスケープシーケンス)で使われていると思われます。

間違いといえば間違いだと思いますが、解説書によっては、たとえば「\n」全部をエスケープ文字としたり「\」のみをエスケープ文字としたりするので、そのあたりは曖昧に使われていると感じます。

本来は「\」がエスケープ文字で、「\n」がエスケープシーケンスで正解でしょう。

> エスケープ文字 = 文字が持つ特別な意味を無効にする為の文字

たぶんこちらをご覧になられたのかもしれませんが
http://msdn.microsoft.com/ja-jp/library/aa559665 …

それだけ読むと、誤解されるような表現ですね。

この回答への補足

http://msdn.microsoft.com/ja-jp/library/aa559665 …

では回答者様が提示した上記リンク先内容の「エスケープ文字」の概念はC言語では存在しないと言う事でしょうか?
存在しないとなれば一般的に同義語で扱われている事も納得できます。

もしそうでない場合、「\n」は「エスケープ文字」と「エスケープシーケンス」意味が混同してしまうと思います。

また私の考えが誤っている場合は指摘をお願いいたします。

補足日時:2014/06/21 14:50
    • good
    • 0

例えば


http://www.tohoho-web.com/js/string.htm
ではエスケープ文字の説明で
文字列の中では、バックスラッシュ(\)に続く 1 文字は特別な意味を持ちます。これらの文字をエスケープ文字と呼びます。
\n - ニューライン(改行文字)
などと書いてありますが,説明がおかしい。

ちゃんとした定義では,この例だと
「\」がエスケープ文字であり,「\n」がエスケープシーケンスです。そして「n」はエスケープされた文字。

この回答への補足

私は「エスケープシーケンス」を下記の様に理解しているのですがよろしいでしょうか?
「エスケープシーケンス = 改行などの特殊な文字を英数字の組み合わせで表現した物。」

もし私の理解の仕方が間違っているのであれば指摘をお願いいたします。


また「エスケープ」とは具体的に何なのでしょうか?

補足日時:2014/06/21 14:19
    • good
    • 0

>それはC言語ならではの扱い方なのか?、本書の内容が間違っているのか?



ご自分で導きだした答えが間違ってるという考えはありませんか?
具体的にはこれ。

>エスケープ文字 = 文字が持つ特別な意味を無効にする為の文字。

この回答への補足

「C エスケープ文字」と検索した結果と「C エスケープシーケンス」と検索した結果は基本的に「改行などの特殊な文字を英数字の組み合わせで表現し物。」と言う様なニュアンスで書かれています。

つまり同義語の様な捉え方で良いと言う事ですか?

また、>エスケープ文字 = 文字が持つ特別な意味を無効にする為の文字。
と言う内容はC言語に関しての内容では有りませんが、下記リンク先にて
引用しました。
http://wa3.i-3-i.info/word11732.html

もし、C言語と他の言語では「エスケープ文字」に関しての定義が異なるのであれば同義語と言う形で納得出来るのですが.....

また私が誤った考えをしている場合は指摘をお願いいたします。

補足日時:2014/06/21 14:07
    • good
    • 0

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