リテラル
整数リテラル
数値や文字列をコードに直接記述したものをリテラル(Literal)と呼びます。例えば、整数 10 や文字列 "The world is all one!!" など、コードに直接書かれたデータがリテラルです。リテラルは固定された値なので、プログラムで変化することはありません。コードに書かれた 10 という値は、何度実行しても 10 という値です。
データには様々な種類がありますが、リテラルの種類は定められています。
- 整数リテラル
- 実数リテラル
- ブール型リテラル
- 文字リテラル
- リテラル文字列
- null リテラル
これらリテラルで表現できるデータは、プログラムで計算を行ったり文字列を扱ったりするために必要な最も基本的な情報となります。
整数リテラル
整数リテラル(Integer literals)は、0 ~ 9 までの数字だけを使った 10 進数と、0 ~ 9 までの数字と A ~ F アルファベットを使った16進数を使用できます。
10 進数は見たままですが、16 進数で書く場合は数値の前に 0x 接頭辞を付加する必要があります。なお、16 進数の A~F は小文字で指定しても問題はありません。0x2A でも 0x2a でも結果は同じです。
組織的な開発では、コード内の 16 進数の表記で大文字と小文字が混在していると、無用な混乱を起こす可能性があるため統一するべきでしょう。個人的には、大文字が見やすいので大文字で統一することを推奨します。
当然、リテラルはどこにでも書けるわけではありません。記述した値は、どこかに保存か、またはどこに出力するか指示しなければなりません。この場では、単にリテラルを画面に出力してみましょう。WriteLine() メソッドは、二重引用符で括られた文字列だけではなく、他の種類のリテラルもすべて同じように出力できます。
System.Console.WriteLine(10);
例えば、上のコードでは WriteLine() メソッドに 10 という整数リテラルを渡しています。この結果、コンソールに整数 10 がテキストとして表示されます。
class Test { static void Main(string[] args) { System.Console.WriteLine(765); System.Console.WriteLine(0x3C1); } }
このプログラムでは WriteLine() メソッドに 765 という 10 進数と、3C1 という 16 進数(10 進数の 961)を渡しています。 WriteLine() メソッドは、この数値を文字列に変換しコンソールに出力します。
ただし、16 進数で記述した場合も 10 進数で記述した場合も、表記方法が違うというだけで同じ整数型であることに変わりはありません。WriteLine() メソッドは 10 進数で整数を出力するので、16 進数で表記した値を WriteLine() メソッドに渡した場合も、10 進数で表示されてしまいます。
実数リテラル
小数点以下を含む数値を表現する場合、整数リテラルではなく実数リテラル(Real literals)を使用します。大きな違いはないように思えますが、上記の整数リテラルと、小数点を含む実数リテラルは、プログラムにとっては異なる種類のデータとして解釈されます。
実数リテラルの基本的な構成は 10 進整数部と小数点以下の 10 進小数部の組み合わせです。整数と違い 10 進数でしか表現できません。
実数リテラルは、一般的な表記と同じように整数部と小数部の間をピリオド . で区切ります。ピリオドより左側が整数部、右側が小数部となります。整数部は省略することができ、整数部を省略した場合は整数部が 0 であると判断されます。
class Test { static void Main() { System.Console.WriteLine(3.14); System.Console.WriteLine(.123); } }
また、実数リテラルは指数表記も可能です。 指数表記とは、指数部(Exponent part)を持つ実数リテラルで、アルファベットの e または E から始まり、続く 10 進整数で指数を表します。指数部を表す e または E は、大文字と小文字のどちらでも同じ結果となりますが、コード全体でどちらかに統一するべきです。
指数部に指定する整数の前に、必要に応じて + 記号、または - 記号のいずれかを指定することもできます。省略した場合は + と同じで、負の指数を表すには必ず - 記号を指定しなければなりません。
class Test { static void Main() { System.Console.WriteLine(1.23e5); System.Console.WriteLine(1.23e+3); System.Console.WriteLine(1.23e-3); System.Console.WriteLine(123e-3); } }
小数部を指定せず、整数部と指数部だけでも実数リテラルとして扱われます。指数用いることで、少ない桁数で大きなまたは小さな値を表現できます。
ブール型リテラル
ブール型リテラル(Boolean literals)はやや特殊なリテラルで、真または偽の 2 つの状態しか持たない値です。基本的な用途は、条件が満たされているかどうかの結果を伝えるためのデータとして用いられます。そのほかに、有効・無効、表示・非表示というような 2 つの状態(つまり YES か NO)で表現できる種類のデータ表現に応用されます。
ブール型リテラルは true キーワード、または false キーワードのいずれかで表現されます。これらは C# 言語仕様で定められているキーワードであり、true であれば真、false であれば偽を表します。
class Test { static void Main() { System.Console.WriteLine(true); System.Console.WriteLine(false); } }
コード4はブール型リテラルをそのまま出力したものです。これらの値は、条件分岐といった流れ制御の条件に利用されます。
文字リテラル
C# は 1 文字と文字が連続する文字列を区別します。文字リテラル(Character literals)は 1 文字を表現するデータであり、文字と文字列とは異なります。文字リテラルは引用符 ' で対象の文字を括ります。文字列ではないため、複数の文字を含めることはできません。
class Test { static void Main() { System.Console.WriteLine('A'); System.Console.WriteLine('#'); System.Console.WriteLine('猫'); } }
コード5のように、文字リテラルは任意の文字や記号、数字といった、任意の印字可能な 1 文字を引用符で括ります。
.NET Framework による文字の内部表現には Unicode を使用しています。Unicode は 2 バイト文字なので、文字リテラル 1 文字に 2 バイトの容量を使用します。文字リテラルは国際化に対応した Unicode なので、アルファベットなどの 1 バイト文字だけではなく、漢字などの全角文字を含めることもできます。
エスケープシーケンス
改行などの印字できない特殊な文字に関しては \ 記号から始まる 2 文字で表現されるエスケープシーケンス(Escape sequences)で表現できます。エスケープシーケンスは \ 記号に続き定められた文字を指定することで、リテラルで表現できない特殊な文字を表すことができます。
例えば、文字リテラルは構文による制限で改行できません。そこで、文字リテラルやリテラル文字列で改行を表すには、改行を表すエスケープシーケンス \n を使います。
他にも、表1のようなエスケープシーケンスが定められています。
エスケープシーケンス | 文字名 | Unicode |
---|---|---|
\' | シングルクォーテーション | 0x0027 |
\" | ダブルクォーテーション | 0x0022 |
\\ | 円マーク | 0x005C |
\0 | null | 0x0000 |
\a | アラート | 0x0007 |
\b | バックスペース | 0x0008 |
\f | 改ページ | 0x000C |
\n | 改行 | 0x000A |
\r | キャリッジリターン | 0x000D |
\t | 水平タブ | 0x0009 |
\v | 垂直タブ | 0x000B |
\x16進数 | 16進エスケープシーケンス |
例えば、引用符で括られる文字リテラルで引用符を文字として表現することはできません。そこで、文字リテラル内で引用符を表現するにはエスケープシーケンス \' を用います。
class Test { static void Main() { System.Console.WriteLine('\''); System.Console.WriteLine('\n'); System.Console.WriteLine('\\'); } }
このように、エスケープシーケンスの存在があるため \ 記号を文字として使うときは注意してください。単に \ 記号を文字や文字列内で記述すると、不正なエスケープ文字として扱われたり、続くアルファベットによって意図していないエスケープ文字として解釈される可能性があります。文字として \ 記号を表すには、エスケープシーケンス \\ として記述してください。
リテラル文字列
最初に WriteLine() メソッドで任意のテキストをコンソールに表示するために用いたものが文字列でした。二重引用符で括った文字列もリテラルの一種であり、リテラル文字列(String literals)と呼ばれます。
C# のリテラル文字列は標準リテラル文字列(Regular string literal)と逐語的リテラル文字列(Verbatim string literal)の 2 種類が存在します。
標準リテラル文字列は、単純に二重引用符で 0 個以上の文字を括った文字列です。文字リテラルと同様にエスケープシーケンスを含むことができます。他の標準的なプログラミング言語における文字列と、ほぼ同じでしょう。
逐語的リテラル文字列は @ 文字に続き二重引用符で 0 個以上の文字を括った文字列です。標準リテラル文字列は、二重引用符を閉じるまで改行を含めることはできません。しかし、逐語的リテラル文字列は改行も含め、コード状のテキストをほぼ見たままに文字列として解釈されます。
エスケープシーケンスの扱いも特殊で、ほとんどの単純なエスケープシーケンスは処理されません。ただし、二重引用符だけは解釈できないので、連続する二重引用符 "" を、二重引用符を表す特別なエスケープシーケンスとして解釈します。
class Test { static void Main() { System.Console.WriteLine("Stand by, ready."); //標準リテラル文字列 System.Console.WriteLine(@"Get set."); //逐語的リテラル文字列 System.Console.WriteLine("水平タブは \t で表す"); System.Console.WriteLine(@"水平タブは \t で表す"); System.Console.WriteLine("He said \"Make a contract with me\" to a girl."); System.Console.WriteLine(@"He said ""Make a contract with me"" to a girl. "); System.Console.WriteLine("---\nきさま――\nいったい何人のプログラマを\nその案件のために犠牲にした!?\n---"); System.Console.WriteLine(@"おまえは 今までに使い捨てた 乾電池の数を おぼえているのか?"); } }
コード7は標準リテラル文字列と逐語的リテラル文字列でエスケープシーケンスや改行文字の扱いがどのように違うのかを表しています。逐語的リテラル文字列は \ 記号がそのまま表示され、エスケープシーケンスとして展開されることはありません。また、改行や水平タブもコード状に書いたとおりに文字列化されます。
多くの場合は標準リテラル文字列が使われますが、記号や改行を多く含むテキスト(例えばプログラムコードや XML など)をコードに文字列として埋め込む必要がある場合に逐語的リテラル文字列を使うと便利です。
null リテラル
この他に、参照するべき実体がないことを表す特殊な値として null リテラル(The null literal)が用意されています。null リテラルは null キーワードのみを値とし、それ以外の状態は持ちません。