C++入門/整数値の計算

柴田祐樹,東京都立大学,情報科学科
戻る

ここではあらゆる四則演算を計算機に行わせ,結果を得る(画面に出力する)方法を説明するが,その前に,結果の記憶方法と表示方法から説明する.計算機では,計算した数値を画面に出力するまでの間,どんなに短い時間であっても明確な手順で記憶する必要がある.つまり,数値の記憶方法と,記憶した値の表示方法を知らなければ,計算結果を知ることができない.ここで,記憶と表示という異なる処理で同じ値を参照する必要があるのだから,これを一意に指定する仕組みが必要である.このために,物事に名前をつけ,区別することは日頃から行っていることであるが,プログラムでも同様に,対象に名前をつけて,それぞれの処理単位で同じものを指定できるようにする.

以下に,名前aである整数値(integer)を記憶可能な場所(記憶域と呼ぶ)の宣言方法と,記憶域の利用例を示す.

#include <iostream>

int main(){
    int a;
    a = 1;
    std::cout << a << char(10);
    return 0;
}

3行目で,名前aの記憶域を宣言している.このaを指定することで,記憶と読み出しが可能になる.4行目で,値1をaの記憶域に記憶している.C言語の習慣であるが,= は左に指定された記憶域に右の値を代入することを意味する(<-とかにすればよかっただろうに,紛らわしい習慣であると思う.).5行目で,このaの記憶域の値を読み出し,文字列として画面に表示している.6行目は見やすくするために改行を行うためのものである.前述でのstd::coutの使い方と異なり,数値を直接指定するのではなく,記憶域を指定している.前述での「Mac OS 用」の記載は省略する.

この名前がつけられた記憶域のことを変数と呼ぶ.例えばaという名前の記憶域に値1を代入する,ということを簡単に,変数aに値1を代入する,などと言ったりする.

= の右側には式を書くことができる.以下に2 + 3の値と,2 \times 3の値を表示する例を示す.

#include <iostream>
int main(){
    int a;
    a = 2 + 3 + 4;
    std::cout << a << char(10);
    a = 2 * (3 + 4);
    std::cout << a << char(10);
    return  0;
}

この例の4行目では,足し算を定義している.7行目では,掛け算と結合順序の指定を行い計算をしている.掛け算を\timesと記載するのが普通だが,C言語ではこの行のように*で記載する(×という文字を表現する余裕が昔なかったためであろう.近年はそうではないはずだが,この慣習は未だに是正されていない.).出力結果は,以下のようになるはずである.b.cpp はファイル名で,以降の説明でも同様とする.

[shibata@127 cpp]$ g++ b.cpp [shibata@127 cpp]$ ./a.out 9 14

更に,変数を複数定義することが可能で,ある変数の値を別の変数の値の計算に使うことができる.以下に例と出力結果を示す.

#include <iostream>

int main(){
    int a;
    int b;
    int c;
    b = 2;
    c = 3;
    a = b + c;
    std::cout << a << char(10);
    a = b * c;
    std::cout << a << char(10);
    return 0;
}
[shibata@127 cpp]$ g++ b.cpp [shibata@127 cpp]$ ./a.out 5 6

変数b, cと,出力用の変数aが定義され,使われているが,12行めの出力結果からわかるように,b, cの値は,+ や * といった計算により変更されていない.これは,= の右側に記載された変数は値の読み出しのみに使われ,その値が変更されることはないからである.また,= による代入は,= 右側の式の計算がすべて完了してから行われる.

式の評価に用いた変数へそのまま代入することも可能である.以下に例と出力結果を示す.

#include <iostream>

int main(){
    int a;
    a = 0;
    a = a + 1;
    a = a + 1;
    a = a + 1;
    std::cout << a << char(10);
    return 0;
}
[shibata@127 cpp]$ g++ b.cpp [shibata@127 cpp]$ ./a.out 3

上記結果からもわかるように,式の評価が先に行われ,= による代入がその後に行われることになっている.a = a + 1,つまり 2a = 1 という方程式を解かせることを意図したものではない.

必須事項ではないが,記載方法について以下のように一行に複数の式の評価と代入を書くことも可能である.処理の内容は先の例と同じである.

#include <iostream>

int main(){
    int a;
    a = 0;
    a = a + 1; a = a + 1; a = a + 1;
    std::cout << a << char(10);
    return 0;
}

「;」で区切られた単位で順に評価されていく.プログラム中の文字は上にあるもの,その次に左にあるものが順に評価されていくと覚えておくと良い.これは普通の文章の読み方と同じ決まりである.この例ではあまり恩恵が感じられないが,次のように意味的まとまりが見られるコードをわかりやすく書くことが可能である.これは1ずつ増える数列と,2ずつ増える数列の第3項を計算するコードである.

#include <iostream>

int main(){
    int a;
    int b;
    a = 0;
    b = 0;
    a = a + 1; b = b + 2;
    a = a + 1; b = b + 2;
    a = a + 1; b = b + 2;
    std::cout << a << char(10);
    std::cout << b << char(10);
    return 0;
}

ちなみに変数名は,以下の規則を満たす限り何文字で構成されていても問題がない.

例えば以下のコードでもコンパイルできるはずである.先程のコードのa, b という変数の名前ががそれぞれ,aAAsfa,ビーという変数,に変わっている.日本語が入っていてもg++10など最新のコンパイラならば問題がないはずである.

#include <iostream>

int main(){
    int aAAsfa;
    int ビーという変数;
    aAAsfa = 0;
    ビーという変数 = 0;
    aAAsfa = aAAsfa + 1; ビーという変数 = ビーという変数 + 2;
    aAAsfa = aAAsfa + 1; ビーという変数 = ビーという変数 + 2;
    aAAsfa = aAAsfa + 1; ビーという変数 = ビーという変数 + 2;
    std::cout << aAAsfa << char(10);
    std::cout << ビーという変数 << char(10);
    return 0;
}

練習問題

問題1

1 + 2 + 3 + ... 10を計算し変数 S に格納して出力せよ.また,n(n+1)/2の公式による値と比較せよ

問題2

1 + 2^2 + 3^2 + ... 10^2を計算し変数 S に格納して出力せよ.また,n(n+1)(2n+1)/6の公式による値と比較せよ

回答

integer-ans.cpp: 見てもらうとわかるが,和の計算自体には0と1しか用いていない.1, 2, 3,... などという数列は計算機が計算できるのだから明示的に書く必要はないのである.