• ベストアンサー

アンダーバーとバックスラッシュ

くだらないことですが、ふと気になったので質問させてください. 人様のソースをのぞいていると、 _abcd _abcd_ abcd_ という変数のつけ方をよく見かけます. 一番上に関しては予約語だったり、昔のシステムコール等についていたということを過去ログを見て知ったのですが、両端や右端につける場合も同じような理由なのでしょうか? あともうひとつはプログラミングとさほど関係ありませんが。。 ASCIIの半角バックスラッシュ(\)はwindowsの日本語フォントでは殆どの場合 円マーク(\)となりますが、欧州、中国とかだと、これがその国の通貨のマークに変わったりするのでしょうか? 円マークは日本だけですか? お馬鹿な疑問ですがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

xcrOSgS2wYさんの言われる「普通のものではない」ということから思い出したことがあります。 実は、C++(および一定の条件を満たすC)では、識別子に($)を使うことができます。これは特定のコンパイラの拡張機能ではなく、(概ね)標準の機能です。 というのは、C++では基本ソース文字集合にない文字がソース中に現れると、国際文字名に変換されてコンパイルされます(厳密にいうと、標準に準拠しているなら変換されるはずです)。漢字などは対応する文字コードに強く依存しますが、($)の場合は比較的互換性があります。 国際文字名に完全対応しているコンパイラは実際にはあまりありませんが、($)に限っては、GCCも、VC++も、もともと拡張機能として使用することができます。経緯はどうであれ、現在では、識別子中の($)を国際文字名に変換されるはずの拡張ソース文字集合の中の1文字であると主張してもあながち間違いではなさそうです。 主要な処理系が、国際文字名にまともに対応するようになれば、やむを得ず予約済みの識別子を使ってしまうこともなくなりそうです(なくなって欲しい)。 ちなみにVC++8.0では、識別子に漢字なども普通に使えるようです。

ytse
質問者

補足

自分もそれくらいC/C++に詳しくなりたいなぁと憧れの眼差しで見てしまいます(笑 自分にとってちょっと話が難しいですが、英数字_以外の文字が使えるとはびっくりしました。そういえばどこかの誰かがJAVAのクラスに漢字が使えるようなことを言っていたようないってないような。。 それでためしにjavacしてみたらコンパイルできちゃいました(実行はできませんでしたが・・) VC++ももっていないので、お金に余裕ができたら試してみようと思います。 ありがとうござましたm(_ _)m

その他の回答 (5)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.5

なぜ _abcd _abcd_ abcd_ のような変数名(ないしシンボル名)を使うのか、という観点からの回答です。 「普通のものではない」「一般的なものではない」ということを見た目上で表現したいとき、何か特別な印を付けるということがよく行われます。日常の文章では「※」を付けたり「†」を付けたりするように、プログラムコード(一般)では【$】を付けたり【_】を付けたりします。 さて、プログラムコード内のシンボル名として使用できる文字種は、それぞれの言語によって決まっています。C/C++では英字で始まり、2文字目以降は英字・数字・アンダーバーを使う1文字以上の文字の連なりが使用できます。(※注:予約語については、ここでは説明を省略します。) そうすると、この中で「特別な印」として使える文字はおのずと【_】だけに制限されることになります。英字はシンボル名に英単語を使うと26文字とも必要ですし、数字は当然10文字とも必要なので、残るは【_】だけだからです。 次に【\】と【¥】の関係について。 大昔、ASCIIの半角【\】コードの場所に【¢】が入っていた時期があります。おそらく、その頃に日本で【¥】が必要とされ、通貨記号としては既に【$】があるので【¢】は省略してもよいだろうという判断でその場所に日本では【¥】が入れられたのではないかと想像しています。(真偽の程は確認していません。)

ytse
質問者

お礼

ありがとうございます。 >普通のものではないことを表現したいとき なるほど、、実を言うと自分もそんな感じの使い方をしていました。 例えば、グローバル変数の前には _ をつけてみたりとか・・。PHPだと $_POST $_GET なんて配列変数もありますよね。 決して間違ったことをしていなかったのかなぁとほっとしました。 \の話についてもありがとございました。 その情報をもとにもう少し調べてみます。

noname#39234
noname#39234
回答No.4

韓国のKS系のコードだと半角¥記号のコードが ウォン記号に割り当てられます。 そういう意味では、英文メール等で金額を表記する場合 ¥記号は使わず、yenと表記する法が混乱が無い。 プログラムの出力としても好ましくは無い。 たとえば¥記号の呼び名を知らない人が見た場合 その意味を調べることもできない。

ytse
質問者

お礼

>KS系のコードだと半角¥記号のコードがウォン記号 ちょっと勘があたってうれしいです。 たしかにそうなると、円マークを半角であらわすのはまずいんですね。 そんな落とし穴に気がつきませんでした。 英文メールをうったことは皆無ですが、今後気をつけます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

#2です。前回(やはり上手く表示されませんでしたね)は、バックスラッシュにしか書いていませんでした。 下線(アンダースコア)を両端や右端につける場合についてですが、右端につける場合は何の問題もありません。ただし、C++の場合は、識別子のどこであろうと、二重の下線が含まれていると予約名になるので使えません。 両端の場合ですが、たとえ終端に下線を付けようとも、先端に下線があれば、ファイル有効範囲(C++の場合は大域的名前空間有効範囲)では予約済みになります。

ytse
質問者

お礼

>C++の場合は、識別子のどこであろうと、二重の下線が含まれていると予約名になる 過去にたしかに2重の_はなんなんだ!と思った覚えがあります。 __LINE__ とか、__FILE__ ですよね。 詳しい情報、ありがとうございますm(_ _)m

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

まず原則から説明すると、標準Cの規格では文字集合だけを規定しており、それがどんな値で表現されるかについては規定されていません。つまり、本来であれば、日本でも「¥」ではなく「\」を使うべきなのです。半角文字で表現しきれないのであれば、char型を16ビットにして、全角文字を使ってでもそうするのが筋です。あるいは三文字表記を用いて「??/」とするかです。 ただ、現実には米国製のコンパイラと互換性を保つために、「¥」になってしまっても同じ文字コードを使用しているわけです。 その文字コードであるISO646は、国ごとに選択可能なコードがいくつかあります。そのひとつが 5C というわけです。そして、 5C が通貨記号かというとそうでもありません。米国の「$」も別のコードですし、英国の「£」は「#」と同じコードになります。ヨーロッパ諸国では「ö」「ø」「ç」などが当てられています。(上手く表示されないかも)

ytse
質問者

お礼

>日本でも「¥」ではなく「\」を使うべきなのです なるほど・・。 なんでそんなややこしいことになったのかがちょっと不思議ですね。 英国の「£」は「#」というのもはじめて知りました. ありがとうございます。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

OSやプログラミング言語によって_の扱いは様々です。普通の英数字と同じに扱うもの、予約語に認めるもの、全く認めないものがあります。 ASCII(ISOと言った方がいいですが)では、いくつかのの符号は 勝手に定義していいことになっています。 国ごとにあるいは言語によっても違います。 ちなみに、C言語では文字列の最後は「バックスラッシュ」ですが日本では「¥」で表示されます。 書籍にも両方の記載が見られます。

ytse
質問者

お礼

ありがとうございます。 使い方は多種多様なのですね。 Cのライブラリなどを見ていて、なんか意味があるのか??といつも不思議に思っていました。 自分は変数名のスペースの変わりに使うくらいなので。