• ベストアンサー

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

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

  • ytse
  • お礼率71% (88/123)

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

  • ベストアンサー
  • 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のライブラリなどを見ていて、なんか意味があるのか??といつも不思議に思っていました。 自分は変数名のスペースの変わりに使うくらいなので。

関連するQ&A

  • バックスラッシュ

    こんばんは。お世話になります。 PCの回復コンソールインストールしようとしたのですが、半角バックスラッシュの入力ができず、こまっています。 ATOK15使用、記号では入りますが\半角になりません。 文字コード表から、Time new roman、Arialなど選びバックスラッシュをこぴー貼り付け、しかし円マーク¥になってしまいます。 なんとか半角バックスラッシュを付けたいと思いますので、よろしくお願いします。 「ファイル名を指定して実行」に入力中でした。コードが同じ¥マークで代用できるかと思いましたが、×でした。

  • 半角のバックスラッシュが、表示できたり出来なかったりするのはなぜですか?

    OK Waveユーザ各位 アホな質問にお付き合い願えれば幸いです。 ふと、バックスラッシュ”\”を入力したくなりました。 1 キーボード右下、表示はトップスコア・バックスラッシュ及び”ろ”のキーを、日本語FEPの「入力モード」を「半角英数」にして押下…"\"と"_"が表示される・× 2 同キーを「入力モード」を「ひらなが」にして押下…全角の"_”と”¥”が表示される・変換キーを押下しても半角全角に変わるのみ。…× 3 IMEパッド「手書き」で斜め線を引く…候補に出てこない・× 4 IMEパッド「文字コード」でひたすら総当たりでサーチ…全角”\”は発見できたが、半角は発見できず・× 5 半角バックスラッシュの使用されていたWeb PageかCopy。NotebookにPaste…"\"に変換されてしまう・× 6 ネットででバックスラッシュを検索http://www.netlaputa.ne.jp/~kose/Software/backslash/、なるページを発見するも、システム要件が今一つ対応しているのか不明でパッチ当てに踏み切れず・× 7 改めて基本に帰ってASCII Code Tableをみると、半角バックスラッシュはあるが"5C(16)"にあるが、、日本語ASCIIコード表には無い(同一文字コードには"\"がAassignされている)・×  8 Wikipediaを読む。どうやら日本語Windowsでは、半角バックスラッシュはサポート外らしい事がなんとなくわかった様なわからない様な(^_^;)ゞ という様な経緯で、半角バックスラッシュは扱えないらしいという結論にたっしたのですが、疑問が二つ湧きました。 A なぜIMEパッドで斜め線を引いたり画数で検索しても、全角バックスラッシュが出てこないのか? B ブラウザでは半角バックスラッシュが表示されるのはなぜか? です。UnicodeとかシフトJISが良く分からない私なので(EBCDIC Codeで止まっています(^_^;)ゞ)、このあたりの事情をご教示いただけると幸いです。 参考までに、私の環境は DELL M17x Windows Vista です。 何卒宜しく御願い申し上げます。 

  • バックスラッシュのタイプ方法

    JAVASCRIPTのコードで、 バックスラッシュ(/の反対のスラッシュ)をタイプしたいのですが、¥(円マーク)がタイプされてしまいます。 日本語版キーボードではないので、 キーボードの設定もそのようにしているのですが、 WINDOWSは日本語版だからでしょうか、タイプできません。 こんなことで質問するなんて、本当に恥ずかしいのですが、もしもバックスラッシュのタイプ法を知っている方、 教えてください!!

  • VS2012での\(円マーク)とバックスラッシュ

    VS2012のVBでコードを書きはじめました。OSはWin7(x32) 日本語です。 ファイルを呼び出そうと思っても呼べずに困っています。 FileName = "c:\textfile.txt" ret = LoadFile(FileName) としたときに、”textfile.txt“にアクセスできないのは、デバッグモードで実行したときに”\”がバックスラッシュとして扱われているからではないかと疑っています。 原因を探っていくうちに下記を疑い始めました。 Dim FileName As String FileName = "\" として、デバッグモードでFileNameの値を見ると円マークではなくバックスラッシュになっています。 しかし、FileNameの値をテキストボックスに出力させると円マークです。 (1)このような状態でもパス名に問題は無いのでしょうか ⇒どちらも同じASCIIコード92だから、内部で92を渡すだけだから問題ない? (2)Visual studio内でキーボードを選択する部分があるのでしょうか?

  • スタイルシートで円マークがバックスラッシュに

    スタイルシートを使って半角の円マークを使ったら、 バックスラッシュで表示されてしまったのですが、 回避する方法はないでしょうか?

    • ベストアンサー
    • HTML
  • 日本語環境下でのバックスラッシュの表示

    Perlの勉強を始めたばかりのものです。Windows Me環境でエディタを使ってPerlのプログラムを書きたいのですが、バックスラッシュが「¥」の記号になってしまい、どうすればいいのかわかりません。日本語環境下で半角のバックスラッシュを表示する方法を教えてください。

    • ベストアンサー
    • CGI
  • パスワードに円記号を使った場合について

    WikipediaにASCIIの0x5C番地には円記号とバックスラッシュが割り当てられていると書いてあり、その事でお聞きしたいことがあります。 日本語版ASCIIでパスワードに円記号を設定した場合、米国版ASCIIではバックスラッシュで解除できるのでしょうか? 表記は異なりますが番地が一緒なので気になりました。

  • バックスラッシュと円記号の同居

    ■ 質問にいたるいきさつ バックスラッシュと円記号を同一ページ内に同居させるばあい、IE であれば <head/> の <meta/> に charset=UTF-8 とかき、<body/> に <p>&#x5c; &#xa5;</p> とすれば、表示上バックスラッシュと円記号がならんでみえます。 Netscape と Opera は <p lang="en">&#x5c; &#xa5;</p> でもだめでした。 Netscape は表示メニューの文字コードを ISO-8859-1 にすれば、バックスラッシュが表示されます。 Opera はどうやってもバックスラッシュが表示されません。 ■ 質問 Netscape や Opera をつかってページをみるひとにもバックスラッシュをみせるにはどうすればいいでしょう。 できれば、ページをみているひとに「文字のエンコードをかえてみてください」とはいいたくありません。 できれば、全角のバックスラッシュはつかいたくありません。 できれば、画像はつかいたくありません。 このようなわがままを実現する方法があればおしえてください。 ■ 実験してみた環境 OS: Win XP IE 6 Opera 7.20 Netscape 7.1 いずれも日本語版

  • Windows PEのCMDでバックスラッシュ入力

    動作環境 ASUS Vivobook S400CA CPU Core i5-3317U RAM 4GB Windows 8.1 64bit タイ語/英語キーボード (101 Enhanced キー配列;横長の四角いEnterキーの上にバックスラッシュ表示のキーがあります) 「設定チャーム」>「PC設定の変更」>「保守と管理」>「回復」の中にある、 「PCの起動をカスタマイズする」をクリックしてコマンドプロンプトを立ち上げます。 その画面上でディレクトリー指定やコマンドを打とうとすると、何故かバックスラッシュ(\)が打てません。 どうも認識されているキー配列が違うらしく、例えば「Shift」+「2」キーを押すと「”」が打たれて、 日本語キー配列になっているようです。 このWindows PEのコマンドプロンプト(cmd)に直接バックスラッシュ(\)を入力する方法、 USキー配列に変更する有効なコマンド(usコマンドは効かないです)がありましたらお教え頂けないでしょうか? ちなみに、通常起動したWindows 8.1上で、日本語キー配列にしてバックスラッシュ(\)を打とうにも 本来日本語キーボードの「\」キーが位置するところにはキーが存在しなくて、直接バックスラッシュ(\)が打てるキーが見当たらない状況です。 ただ、これはシステムのレジストリ設定でキー配列を”US 101 Enhancedキーボード”に変えてやると キーボード表示通りのキーで直接バックスラッシュ(\)が打つことができるようになり、 Windows8.1のシステムツールよりコマンドプロンプト上では、USキー配列で直接バックスラッシュ(円マーク)が打てます。 他の質問&回答は一通り目を通しておりますが、解決策は見つかりませんでした。

  • 同じプログラム内でバックスラッシュと円が混在する

    Visual Studio 2008でMFCプログラミングをしています。 リモートコマンドを送るソフトで、送信したコマンドをRead Onlyのエディットボックスに表示させています。 コマンド終わりの「\r」をCStringで文字として表示させるために「\\r」としています。 一応、表示はされているのですが、どうも腑に落ちないので質問しました。 \は環境によってバックスラッシュまたは円に表示される場合があると思います。 私も別にどちらで表示されても構わないです。 しかし、作ったプログラムを実行してみたところ、メインのダイアログではバックスラッシュで表示されているのに、ボタンをクリックして表示したサブのダイアログで同じことをすると円マークで表示されるのです。 同じプログラム内でそんなことが起こるものなのでしょうか?

専門家に質問してみよう