加算・減算と結果の出力 | Programming Place Plus C言語編 第2章

トップページC言語編

このページの概要

以下は目次です。


計算

コンピュータに行わせる仕事として代表的なものは「計算」でしょう。計算を行うプログラムの書き方を知っておかないと、恐らくほとんどのプログラムは書けません。このページでは、まず加算(足し算)と減算(引き算)に限定して進めていきます。また、ここでは整数による計算に限定しておきます(小数を使った計算は少し難易度が高いのです)。

また、計算結果が正常かどうか確認するために、整数を出力する方法も取り上げます。

加算

たとえば「3 + 5」をC言語ではどう書くのかというと、こう書きます。

3 + 5

そのままですね。記号の + は半角文字です。

以前説明したように、C言語では空白文字はほぼ自由に入れたり無くしたりできますから、3+5 のように詰めて書いてもかまいません。しかし、詰めすぎると見やすさを低下させるので、3 + 5 が無難だと思います。


では、3 + 5 の計算結果、つまり 8 を出力するにはどうすればいいでしょうか。

理解しなければならないのは、計算結果は整数の 8 であって、文字列の "8" ではないということです。文字列の "8" なら、puts関数を使って出力できます(puts("8");)。しかし、整数の 8 は puts関数では出力できません(puts(8); は正しくない)。

そこで、整数を出力するには printf関数という別の関数を使います。

printf関数

printf関数を使うと、整数を出力できます。printf関数は非常に万能で、整数でも小数でも文字列でも出力できるのですが、多機能な分だけ、その使い方を理解することが難しくなっています。プログラミングの世界では、多機能であることは必ずしも良いことではありません。「理解が大変」になるため、「間違った使い方をしてしまいやすい」ですし、「実行の際には、いろいろな処理を行う必要があり効率が悪くなりやすい」といった問題があります。ですから、シンプルな puts関数にも良さがあります。

printf関数を使って、3 + 5 の計算結果を出力するには、次のように書きます。

#include <stdio.h>

int main(void)
{
    printf("%d\n", 3 + 5);
}

実行結果:

8

printf関数を使うときには、まずどんなものを出力したいのかを示す必要があります。それが %d の部分です。%d は整数を出力することをあらわしています。printf関数において、%d のように、データの種類を示すという意味を持った特殊な表記のことを 変換指定子 (conversion specifier) と呼びます。

%d の d は、decimal のことで、10進数という意味です。%d 以外にもいくつもの変換指定子が存在します。

そのあとにある \n は改行することを意味します。puts関数は自動的に改行されましたが、printf関数は \n を指定しないかぎり出力しません。原則としては、1行分の出力をおこなうたびに改行をしておくのが無難です。改行せずに出力を終えると、次回の printf関数や puts関数は、その続きとして出力するため、1行の中に出力内容が混ざってしまいます。

続いて、, で区切って、出力する内容(ここでは 3 + 5)を指定します。3 + 5 の部分は計算されて 8 になります。そして、%d の効果によって、整数の 8 として出力されます。

%d 変換指定子について間違っていけないのは、出力したいデータに応じて変換指定子を使うのだということです。%d 変換指定子がデータを整数だと解釈してくれるということではありません。つまり、printf("%d\n", "8"); のように、文字列としての "8" を指定した場合に、これを整数の 8 だと解釈してくれるというものではありません。


%d\n を記述する位置にも意味があります。今回は "%d\n" としていますが、この場合、「整数が1つ出力され、その直後で改行をおこなう」という意味です。"\n%d\n" なら、「改行して、整数を1つ出力して、改行する」ですし、"%d\n\n\n" なら「整数を1つ出力して、改行を3回おこなう」という意味になります。

%d\n 以外の文字を挟んでも構いません。これらの特別な意味を持つ表記以外の文字は、そのまま出力されます。

#include <stdio.h>

int main(void)
{
    printf("3 + 5 = %d\n", 3 + 5);
}

実行結果:

3 + 5 = 8

また、%d を複数記述することで、一度に複数の整数を出力することができます。その場合は、, で区切って、必要な個数だけ整数を並べる必要があります。

#include <stdio.h>

int main(void)
{
    printf("%d %d %d\n", 3 + 5, 4 + 5 + 6, 20);
}

実行結果:

8 15 20

減算

続いて、減算(引き算)を試してみます。

C言語では、減算(たとえば、10 - 1)を次のように書きます。

10 - 1

加算と同様、別に特別な記法というわけではありません。やはり - は半角文字です

実行できるプログラムとして書くと、次のようになります。

#include <stdio.h>

int main(void)
{
    printf("%d\n", 10 - 1);
}

実行結果:

9

符号

減算の場合、計算結果が負数(0 より小さい数)になることがありえます。といっても、別に難しいことはありません。10 - 15 を計算させてみます。

#include <stdio.h>

int main(void)
{
    printf("%d\n", 10 - 15);
}

実行結果:

-5

実行結果のように、-5 が出力されます。負数なので、それをあらわす - が付いています。

負数をあらわすために数の頭に付けられる - は、符号 (sign) と呼ばれます。符号は、ソースコード内で使うこともできます。

#include <stdio.h>

int main(void)
{
    printf("%d\n", -5 - 1);
}

実行結果:

-6

符号の - と、減算をあらわす - は同じ記号です。このように、同じ記号を別の意味で使うことがよくあります。

符号にはもう1つ + があって、こちらは正の数であることを表します。やはり、加算をあらわす + と同じ記号です。

符号の + は付けても付けなくても意味が変わらないので、普通はいちいち付けません。

#include <stdio.h>

int main(void)
{
    printf("%d\n", +3 - 1);
}

実行結果:

2

用語を確認

ここで、きちんとした用語を確認しておきます。

定数、リテラル

ソースコードの中にあらわれる 3 とか 5 といった整数の表記を、整数定数 (integer constant) と呼びます。

【C++プログラマー】C++ では整数リテラル (integer literal) と呼びますが、C言語では整数定数と呼びます。意味することは同じと考えていいです。なお、文字列リテラルのほうは、C言語でも文字列リテラルです。

"" で囲まれた文字の並びを文字列リテラルと呼びました。リテラル (literal) とは、 「文字通りの」という意味の英単語で、プログラマーが必要としているデータを文字通り記述したものというニュアンスです。リテラルは、ビルドしても実行しても、なにかほかのものに変えられてしまうことがない、不変なものです。整数定数という名前に含まれている「定数 (constant)」も、事実上はリテラルと同じ意味合いです。

-5+5 のように符号が付いている場合、全体が整数定数なわけではありません。整数定数と呼べるのは 5 の部分であって、-+ は演算子 です。

演算子

演算子 (operator) は、どんな処理をしたいのかをあらわす数文字程度の記号のことです。

加算がしたければ + という記号を使いますし、減算がしたければ - という記号を使いますが、それぞれが演算子です。また、符号の +- も演算子です。

これらの演算子の名称は定まっておらず、さまざまな呼ばれ方をしています。加算や減算の +- は加算演算子と減算演算子、プラス演算子とマイナス演算子、binary + operator と binary - operator などと表現されます。

符号の +- は正符号演算子と負符号演算子、単項プラス演算子と単項マイナス演算子、unary + operator と unary - operator などと表現されます。

C言語編では今後、加算演算子、減算演算子、正符号演算子、負符号演算子と呼ぶことにします。

オペランド

「binary」や「unary」という英単語が登場しましたが、これは、演算子がおこなう処理の対象になるデータが何個あるのかを表しています。日本語では、前者を二項、後者を単項といいます。二項の演算子を二項演算子 (binary operator)、単項の演算子を単項演算子 (unary operator) と表現します。

ここで、“演算子がおこなう処理の対象になるデータ” のことを、オペランド (operand) と呼びます。

二項演算子のオペランドは2個あるということです。加算や減算をあらわす +- は、3 + 5 とか 7 - 1 のように、2つの数とともに使いますから、二項演算子です。また、演算子の左側に来るオペランドを左オペランド (left operand)、右側に来るオペランドを右オペランド (right operand) と呼び分けることがあります。

単項演算子のオペランドは1個です。符号の +- は、+5 とか -1 のように、1つの数とともに使いますから、単項演算子です。

演算子とオペランドを組み合わせたものを (expression) といいます。加算演算子や減算演算子を使った計算式は代表的な式です。

式の終わりに ; が付いている場合には、全体としては、 (statement) と呼びます。

3 + 5   <-- これは式
3 + 5;  <-- これは文。3 + 5 の部分だけをみれば式

長い計算式

ここまでの例はすべて、〇 + △〇 - △ のように、演算子が1つだけの式でした。演算子を増やして、長い計算式にすることも可能です。

#include <stdio.h>

int main(void)
{
    printf("%d\n", 4 + 7 - 2 + 3 - 1);
}

実行結果:

11

読みにくい場合には、( ) を付けても構いません。

#include <stdio.h>

int main(void)
{
    printf("%d\n", (4 + 7) - (2 + 3) - 1);
}

実行結果:

5

今のところ、足し算と引き算だけなので関係ありませんが、( ) には数学と同様、計算の順番を強制する効果もあります。C言語でも、掛け算と割り算は、足し算や引き算よりも先に計算されます。ちなみに、{} や [] を使うことはできません。


練習問題

問題① 3 + 5"3 + 5" はどのように違いますか?

問題② 次のプログラムの実行結果はどうなりますか?

#include <stdio.h>

int main(void)
{
    printf("%d\n", 5 + (-2));
}

問題③ 問題2のソースコードから、定数やリテラルと呼べるものをすべて選び出してください。

問題④ 実行結果が次のようになるプログラムを作成してください。

7 + 8 = 15

ただし、計算結果である 15 の部分は、コンピュータに計算させるようにしてください。

問題⑤ 1~9 までのすべての整数を足し合わせた数を出力するプログラムを作成してください。


解答ページはこちら

参考リンク


更新履歴



前の章へ (第1章 Hello, Worldプログラム)

次の章へ (第3章 乗算・除算)

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る