2日目:演算と変数

C#を使った計算と、値を扱う変数の基本を学びましょう

日数: 0 1 2 3 4 5 6 7

C#での演算処理

演算

1日目では、Console.WriteLine() および Write() を用いて、様々なものを表示してみました。ここではさらに、C#を用いた計算について学んでいきましょう。

プログラミングでは、こういった計算のことを演算と呼びます。ここでは簡単な演算のプログラムを見てみましょう。

サンプルプログラム

プロジェクト: Sample201 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample201
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0} + {1} = {2}", 5, 2, 5 + 2);           //  足し算
            Console.WriteLine("{0} - {1} = {2}", 5, 2, 5 - 2);           //  引き算
            Console.WriteLine("{0} * {1} = {2}", 5, 2, 5 * 2);           //  掛け算
            Console.WriteLine("{0} / {1} = {2} 余り {3}", 5, 2, 5 / 2, 5 % 2); //  割り算と剰余
        }
    }
}
実行結果
5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2 余り 1

実行結果からもわかるとおり、このプログラムを実行すると、様々な計算結果が表示されます。

演算子

このように、C#で様々な演算を行う記号のことを演算子(えんざんし)と呼びます。足し算の + や引き算の - はわかりやすいですが、その他の記号も確認しておきましょう。C#で使用する主な演算子は以下の表2-1のとおりです。

表2-1:C#の計算で用いられる主な演算子
演算子読み方意味使用例
+プラス足し算を行う演算子5 + 5
-マイナス引き算を行う演算子7 - 3
*アスタリスク掛け算を行う演算子7 * 3
/スラッシュ割り算を行う演算子7 / 3
%パーセント剰余(じょうよ)演算子。割り算の余りを求める7 % 3

* が掛け算、/ が割り算を表す記号です。また、% はC#のプログラミングで使用頻度が高いので、ぜひ覚えておきましょう。

パラメータの表示

このプログラムの中で、数値および計算結果といったパラメータを Console.WriteLine() の中で表示している箇所があります。

Console.WriteLine でのパラメータ表示
Console.WriteLine("{0} + {1} = {2}", 5, 2, 5 + 2); // 足し算

" で囲まれた範囲内に書かれている {} の中の番号が、後に , で区切られたパラメータを表示するための番号を示しています。パラメータの値が 5, 2, 5+2 の場合、それぞれに対応する番号は 0, 1, 2 であり、{} 内の同じ番号の位置にそれぞれの値が表示されます。

Console.WriteLineとパラメータの位置関係

図2-1. Console.WriteLine とパラメータの位置関係

変数

C#と変数

C#を用いれば様々な演算ができることはすでにわかりました。しかし、決まった値の計算しかできないのでは不便です。このように値が定まった数のことを定数と言いますが、それに対し、C#には値を常に変えることができる数が存在します。これを変数と言います。

サンプルプログラム

プロジェクト: Sample202 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample202
{
    class Program
    {
        static void Main(string[] args)
        {
            int a;           // 変数の宣言
            int b = 3;       //  初期化と代入を同時に行う
            int add, sub;    //  複数の変数を同時に宣言
            double avg;      //  int以外の変数を宣言
            a = 6;           //  代入(最初に値を入れるので、"初期化"と言う)
            add = a + b;            //  a,bの和を求める
            sub = a - b;            //  a,bの差を求める
            avg = (a + b) / 2.0;    //  a,bの平均値を求める
            Console.WriteLine("{0} + {1} = {2}", a, b, add);
            Console.WriteLine("{0} - {1} = {2}", a, b, sub);
            Console.WriteLine("{0}と{1}の平均値 {2}", a, b, avg);
        }
    }
}
実行結果
6 + 3 = 9
6 - 3 = 3
6と3の平均値 4.5

プログラムの中に abaddsubavg といった文字が出ていますが、これが変数です。int a とある部分を変数の宣言と言います。その後、a = 6 のようにすると値が入ります。これを代入と言います。特に、変数を宣言したときに最初に行う代入のことを初期化と言います。

代入

数値が代入された変数は、その数値として扱うことができます。例えば a = 6 とすれば、a は別の値が代入されるまで「6」として扱うことができます。変数は原則的に何度でも値を変えることが可能です。

変数の初期化と代入
int a; ← 変数の宣言(a という変数を使えるようにする)
a = 6; ← 代入(変数に値を入れる)
変数の宣言と代入のイメージ

図2-2. 変数の宣言と代入のイメージ

演算の優先順位

プログラム中に ()(括弧)がありますが、これは計算の優先順位を変更するものです。

括弧がない場合の計算
1 + 2 * 3 → 結果は 7(先に掛け算が実行される)
括弧を用いた計算
(1 + 2) * 3 → 結果は 9(括弧内の計算が優先される)

このように、C#にも数学と同じような演算子の優先順位があります。加減乗除といった基本的な数値計算に関しては、数学と同じルールに従うと思ってほぼ間違いありません。

()を使用した場合と使用しない場合の演算の処理

図2-3. () を使用した場合と、使用しない場合の演算の処理

データ型

変数の宣言の際に先頭についている intdouble といった記述は何でしょうか?このような記述のことをデータ型と言い、その変数がどのような値を扱うのかを示しています。例えば int は整数型を表し、「int a」とすると「a は整数の値が入る変数である」ことを意味します。主なデータ型は以下のとおりです(表2-3)。

表2-3:C#で用いられるデータ型
データ型説明ビット範囲
byte符号なし整数80 〜 255
sbyte符号付き整数8-128 〜 127
int符号付き整数32-2,147,483,648 〜 2,147,483,647
uint符号なし整数320 〜 4,294,967,295
short符号付き整数16-32,768 〜 32,767
ushort符号なし整数160 〜 65,535
long符号付き整数64-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807
ulong符号なし整数640 〜 18,446,744,073,709,551,615
float単精度浮動小数点型32-3.402823e38 〜 3.402823e38
double倍精度浮動小数点型64-1.79769313486232e308 〜 1.79769313486232e308
char単一 Unicode 文字16テキストで使用される Unicode 記号
bool論理ブール型8true または false
object他のすべての型の基本型
string文字列
decimal29桁の有効桁数で10進数を表現できる正確な小数または整数型128±1.0×10⁻²⁸ 〜 ±7.9×10²⁸

初期化

変数は、宣言時に値を代入(初期化)することができます。また、,(コンマ)で区切ることにより、複数の変数を同時に宣言・初期化することも可能です。

変数の宣言と初期化
int a = 6; ← 変数の宣言と同時に値を代入(初期化)
int a, b; ← 変数 a, b を同時に宣言
int a=1, b=2; ← 変数 a, b を同時に初期化
int a, b=1; ← 変数 a, b を宣言し、b のみを初期化

変数の命名規則

C#の変数の命名規則

変数の名前は、基本的にプログラマーが自由に付けることができます。通常、アルファベット1文字か、その組み合わせが使われる場合がほとんどです。しかし、以下のようなルールがあります。

  • 使用できる文字は半角の英文字(A〜Z、a〜z)、数字(0〜9)、アンダーバー(_)、$。(例:abc、i、_hello、num1、$a など)
  • 変数名の最初の文字を数字にすることはできない。必ず英文字またはアンダーバーから始めること。(例:a123 → ○ 123a → ×)
  • 英文字の大文字と小文字は別の文字として扱われる。(例:ABC と abc は異なる変数とみなされる)
  • C#で規定されているキーワード・定数を使ってはいけない。

キーワード

予約語とは言語の仕様で使い方が決められている単語のことで、C#のキーワードは以下のとおりです(表2-4)。

表2-4:C#のキーワード

abstractasbasebool breakbytecasecatch charcheckedclassconst continuedecimaldefaultdelegate dodoubleelseenum eventexplicitexternfalse finallyfixedfloatfor foreachgotoifimplicit ininterfaceintinternal islocklongnamespace newnullobjectoperator outoverrideparamsprivate protectedpublicreadonlyref returnsbytesealedshort sizeofstackallocstaticstring structswitchthisthrow truetrytypeofuint ulonguncheckedunsafeushort usingvirtualvoidvolatile while

さらに、C#にはコンテキストキーワードというものがあります(表2-5)。これらはコード内で特定の意味を持たせることができます。キーワードと違い変数名として利用することは可能ですが、誤解を避けるためにできれば使用を避けた方が良いでしょう。

表2-5:C#のコンテキストキーワード

addaliasascending asyncawaitdescending dynamicfromget globalgroupinto joinletorderby partial (型)partial (メソッド)remove selectsetvalue varwhere (型制約)where (クエリ句) yield

代入演算子

代入と演算

すでに述べたとおり、変数に値を入れることを代入と言います。代入は例えば以下のように記述します。

代入処理の例
a = 1; ← 変数 a に 1 を代入
a = b; ← 変数 a に変数 b の値を代入
d = 4.0; ← 変数 d に 4.0 を代入

ここで気をつけたいのが、代入で使用する =(イコール)記号の意味です。数学では = は左辺と右辺の値が等しい場合に用いますが、C#の代入における = は「右辺の値を左辺の変数に代入する」という意味になります。そのため、以下のような記述も可能です。

自身を用いた計算結果を代入する
a = a + 1; ← ① a に、a+1 の値を代入する
b = b * 5; ← ② b に、b*5 の値を代入する

例えば①で、最初に a に 4 が入っていたとすると、そこに 1 を足した 5 が a に代入されます。②も同様で、b に 2 が入っていたら、2 に 5 をかけた値、つまり 10 が b に入ります。

プロジェクト: Sample203 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample203
{
    class Program
    {
        static void Main(string[] args)
        {
            // 使用する変数の定義
            int a1=2, b1=2, c1=2, d1=2;  // 変数の宣言(1)
            int a2=2, b2=2, c2=2, d2=2;  // 変数の宣言(2)
            //  通常の演算による計算と代入
            a1 = a1 + 1;
            b1 = b1 - 1;
            c1 = c1 * 2;
            d1 = d1 / 2;
            //  代入演算子による計算
            a2 += 1;
            b2 -= 1;
            c2 *= 2;
            d2 /= 2;
            Console.WriteLine("a1={0} b1={1} c1={2} d1={3}", a1, b1, c1, d1);
            Console.WriteLine("a2={0} b2={1} c2={2} d2={3}", a2, b2, c2, d2);
        }
    }
}
実行結果
a1=3 b1=1 c1=4 d1=1
a2=3 b2=1 c2=4 d2=1

代入演算子

実行結果からわかるとおり、a1 と a2〜d1 と d2 の組み合わせは、記述の仕方が違うだけで結果が同じです。このように、代入演算子を用いれば、短い記述で同じ結果を得ることができます。C#における主な代入演算子は以下のとおりです(表2-6)。

表2-6:C#の主な代入演算子
演算子使用例意味
+=a += 1;a = a + 1;
-=a -= 1;a = a - 1;
*=a *= 2;a = a * 2;
/=a /= 2;a = a / 2;
%=a %= 2;a = a % 2;

キャストとデータの型変換

サンプルプログラム

次に、型の異なる変数に値を代入するケースを見てみましょう。例えば、整数型の変数の値を実数型の変数に代入するような処理です。

プロジェクト: Sample204 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample204
{
    class Program
    {
        static void Main(string[] args)
        {
            int a;
            double b, c, d;
            a = (int)1.23;   //  キャストで代入
            b = 1.23;
            c = 10;          //  キャストなしで代入
            d = (double)c;   //  キャストありで代入
            Console.WriteLine("a={0} b={1} c={2} d={3}", a, b, c, d);
        }
    }
}
実行結果
a=1 b=1.23 c=10 d=10

キャスト

このプログラムでは、15行目で double 型から int 型への変換と、18行目で int 型から double 型への変換を行っています。前者の場合、小数点以下の数値が切り捨てられ、後者の場合は整数が実数に変換されていることが実行結果からわかります。

変換したい値の型を先頭に (int)(double) などと付けることをキャストと言います。

キャストの書式
a = (int)1.23; // double → int へキャスト(小数点以下は切り捨て)
d = (double)c; // int → double へキャスト

なお、int 型から double 型への変換のように、値の範囲が広がる方向への変換の場合、キャストを省略してもエラーになりません。逆に、double から int のように範囲が狭まる方向へのキャストを省略するとエラーになります。

文字列の変数

サンプルプログラム

数値などのほかに、C#では文字列を変数として扱うことができます。文字列の変数を宣言するには string を使います。厳密には intdouble などといったデータ型ではありませんが、データ型と同じように扱うことができます。

プロジェクト: Sample205 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample205
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1, str2;
            Console.Write("str1=");
            str1 = Console.ReadLine();  //  1つ目の文字列を入力
            Console.Write("str2=");
            str2 = Console.ReadLine();  //  2つ目の文字列を入力
            Console.WriteLine("str1 + str2 = {0}", str1 + str2);
        }
    }
}
実行結果
str1=Hello  ← キーボードから文字列を入力
str2=World  ← キーボードから文字列を入力
str1 + str2 = HelloWorld

実行すると「str1=」と表示され、コンソールから文字列の入力待ち状態になります。文字列を入力して Enter を押すと、再び「str2=」と表示され、2つ目の入力待ち状態になります。ここで2つ目の文字列を入力して Enter を押すと、+ 演算子により2つの文字列が結合されて出力されます。このように、+ 演算子を用いれば文字列を結合することができます。

文字列の入力

コンソールからの文字列の入力は Console.ReadLine() で行うことができます。入力された文字列を文字列型変数に代入する書式は以下のとおりです。

コンソールから入力された文字列を文字列型変数に代入
str1 = Console.ReadLine(); ← コンソールから文字列を入力し、str1 に代入
str2 = Console.ReadLine(); ← コンソールから文字列を入力し、str2 に代入

定数

サンプルプログラム

変数は自由に値を変えることが可能ですが、円周率のように値を変えたくない場合があります。そのときに便利なのが const キーワードです。

プロジェクト: Sample206 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample206
{
    class Program
    {
        static void Main(string[] args)
        {
            const int NUMBER = 100;
            const string STRING = "Hoge";
            Console.WriteLine(NUMBER);
            Console.WriteLine(STRING);
            //  const がついた変数は値を変えられない
            //NUMBER = 200;
            //STRING = "fuga";
        }
    }
}
実行結果
100
Hoge

const キーワード

13行目・14行目でそれぞれ int 型・string 型の変数を定義し、初期値を設定しています。15行目・16行目でその結果を表示していますが、ここまでは通常の変数と変わりません。

しかし、18行目・19行目のコメントを外してみてください。エラーが発生します。つまり、const が付いた変数は、一度定義したら二度と値を変更することができないのです。そのため、const は、円周率のような変えられたら困る値に使用するのが一般的です。

練習問題 2 へ →