一部Wikiの使用により全角文字を使っていますが、プログラムはすべて半角文字で書いてください。
プログラムはデータとそれを操作する命令から成り立っています。 プログラミング言語ではたいていの場合データを変数で表し命令を式で表します。 変数や式は数学でなじみのあるものですがプログラミング言語ではよりコンピュータに親和性の高い別の概念となっています。 (本来の数学に近い意味での変数と式を持つ言語もありますが)
たいていのプログラムにおいてデータを一時的に記憶しておかなければならない状況が発生します。 プログラミング言語における変数とは何かを記憶しておくための入れ物のことを指します。 しかしここで一つ問題があります。それはデータごとに必要な記憶容量、できる操作が違うことです。 例えば整数×整数はできますが、文字×文字はできません。なので変数になんでも入れることができるようにすることはできません。 そこで変数に何が入るのかを決めることにしました。これが型と呼ばれるものです。 変数にはその変数が何を入れることができるのかを表す型をつけなければなりません。 また変数には名前をつけておかなければなりません。 さて変数を構成する要素のうち変数がどういうものであるかを説明する型と名前が決まりました。 次はこの組み合わせで使用することをプログラムに書きましょう。これを変数の宣言といいます。
変数の宣言は式ではなく文ですこの違いについては後で説明します。 変数の宣言は
型 変数名;
と書きます。
次に変数に入っている値を更新する、代入を行ってみましょう。 変数への代入は
変数名 = 式;
と書きます。
LinqPadのLanguageをC#Stetment(s)にしておきましょう。 以下の文字を入力し実行しましょう。
int a;
a = 10;
a.Dump();
このプログラムではintが型、aが変数名です。 ところで変数を宣言して代入をしていない状態、つまり変数の中身がわからない場合はどうなるでしょう。 (この状態を未初期化といいます。)
LinqPadのLanguageをC#Stetment(s)にしておきましょう。 以下の文字を入力し実行しましょう。
int a;
a.Dump();
エラーコード(CSXXXXとなっているところです)を検索してみましょう。
変数の宣言と代入は一緒に行われることが多いです。 そのために2つを一緒にできる初期化という機能があります。 変数の初期化は
型 変数名 = 初期値;
と書きます。 初期値には式を書くことができます。
LinqPadのLanguageをC#Stetment(s)にしておきましょう。 以下の文字を入力し実行しましょう。
int a = 10;
a.Dump();
ところで今までint型ばかり使ってきましたが型は他にもあります 以下はC#における整数を表す型です。
型名 | 表せる範囲 | バイトサイズ |
---|---|---|
byte | 0~255 | 1 |
sbyte | -128~127 | 1 |
ushort | 0~65535 | 2 |
short | -32768~32767 | 2 |
uint | 0~4294967295 | 4 |
int | -2147483648~2147483647 | 4 |
ulong | 0~18446744073709551615 | 8 |
long | -9223372036854775808~9223372036854775807 | 8 |
以下はC#における浮動小数点数を表す型です。(コンピュータでは無限にある実数を表すことができないのである程度妥協した数を使います)
型名 | 表せる範囲 | バイトサイズ | 精度 |
---|---|---|---|
float | $\pm 1.5 * 10^{-45} ~ 3.4*10^{38} $ | 4 | 7桁 |
double | $\pm 5.0 * 10^{-324} ~ 1.7*10^{308} $ | 4 | 15桁 |
LinqPadのLanguageをC#Stetment(s)にしておきましょう。 以下のプログラムのようにしてすべての変数を試してみましょう。 また初期値を変えてどうなるか見てみましょう。
byte a = 10;
a.Dump();
ubyte a = 10;
a.Dump();
式とは演算子とオペランドの列と仕様書では説明されています。 オペランドとは変数、式、リテラル(定数)演算子とはそれらを操作する記号のことです。 変数は説明済みなので、リテラルについて説明します。といっても難しいことはなくプログラムを書いたときに決まっている値のことです。 例えば演習1では10はプログラムを実行中は変更できない(無理やりできないこともないですが)値なのでリテラルです。
1+1
ここで1と1がリテラルのオペランド、+が演算子です。+演算子は数学と同じように右のリテラルと左のリテラルの合計を返します。
オペランドに式が含まれているということは式の中に式を組み込めるということです
例えば
1+2+3
は1+2と3がオペランドで+が演算子ということができます。
基本式で行っている内容については後の項で説明します。
式 | 説明 |
---|---|
x.m | メンバー アクセス |
x(…) | メソッド呼び出し |
x[…] | インデックス アクセス |
二項演算子とは2つのオペランドから結果を作り出す演算子です。 例えば+は
1+2
のように1,2という式を取り3という結果を返します
次の通りにプログラムを書いて実行してみてください。
(1+2).Dump();
また以下の演算子も試してみましょう
記号 | 説明 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
% | あまり |
<< | 左シフト |
>> | 右シフト |
& | ビットAND |
| | ビットOR |
^ | ビットXOR |
単項演算子とは1つの式から結果を作り出す演算子です。 例えば-は
-2
のように2という式を取り-2という結果を返します
次の通りにプログラムを書いて実行してみてください。
(-2).Dump();
また以下の演算子も試してみましょう(キャストと論理否定は除きます)
記号 | 説明 |
---|---|
+ | 加算 |
! | 論理否定 |
~ | 補数 |
++ | インクリメント |
-- | デクリメント |
(型) | キャスト |
プログラミングをしていると真と偽の2つの値が重要な場面があります。 例えばこの式が真の時はこうする、偽の時はこうするといったようにです。 真はtrue、偽はfalseで表します。
次の通りにプログラムを書いて実行してみてください。
(2<3).Dump();
次の通りにプログラムを書いて実行してみてください。
(2<3&&4>2).Dump();
また以下の演算子も試してみましょう。
記号 | 説明 |
---|---|
< | 左の式が右の式より小さければ真 |
> | 左の式が右の式より大きければ真 |
<= | 左の式が右の式以下ならば真 |
>= | 左の式が右の式以上ならば真 |
&& | 左の式と右の式が真なら真 |
|| | 左の式か右の式が真なら真 |
代入演算子は文字どうり左の変数に右の式の結果を代入し代入した値を返します。 この時にどのように変数に代入するかを選ぶことができます。
次の通りにプログラムを書いて実行してみてください。
int x;
(x=2).Dump();
x.Dump();
また以下の演算子も試してみましょう(シフトと論理は除きます)
記号 | 説明 |
---|---|
= | 代入 |
+= | 変数と式の合計を代入 |
-= | 変数と式の差を代入 |
*= | 変数と式の乗数を代入 |
/= | 変数と式の徐数を代入 |
%= | 変数と式のあまりを代入 |
<<= | 変数と式の左シフトを代入 |
>>= | 変数と式の右シフトを代入 |
&= | 変数と式の論理 ANDを代入 |
^= | 変数と式の論理 XORを代入 |
|= | 変数と式の論理 ORを代入 |
数学で1+2*3とした時どの順番で計算するでしょうか。 普通は2*3の後に1+をします。よって+よりも*のほうが優先されるわけです。 プログラムにもこの関係がありこれを優先順位といいます。
優先順位の高い方から順に並べています。
カテゴリ | 演算子 |
---|---|
基本式 | x.y f(x) a[x] x++ x-- new typeof checked unchecked |
単項式 | + - ! ~ ++x --x (T)x |
乗法式 | * / % |
加法式 | + - |
シフト | << >> |
関係式と型検査 | < > <= >= is as |
等値式 | == != |
論理 AND | & |
論理 XOR | ^ |
論理 OR | | |
条件 AND | && |
条件 OR | || |
条件 | ?: |
代入 | = *= /= %= += -= <<= >>= &= ^= |= |
また1+2+3はどの順番で実行されるでしょうか。 ふつうは1+2をしてから+3とします。 このように演算子によってどの方向から計算していくかが決まっています。 これを結合規則といいます。
代入演算子と条件演算子は右から左です。たとえば、x = y = z は x = (y = z) と評価されます。
それ以外の2項演算子は左からです。たとえば、x + y + z は (x + y) + z と評価されます。
優先順位と結合規則はかっこで制御することができます。たとえばx+y*zはy*zが先に計算されますが、 (x+y)*zとするとx+yが先に計算されます。