C言語の基本|C言語の式と演算子

式が値を作り、演算子がデータを動かす。C言語の計算を支える基本ルールを身につけよう。

C言語の式と演算子の序章

printfで値を表示し、scanfでキーボードから値を入力できるようになると、次は受け取った値をプログラムの中で操作したくなります。

C言語における演算は、足し算や引き算だけではありません。次のような処理も演算に含まれます。

  • 数値を足したり引いたりする
  • 2つの値を比較する
  • 複数の条件を組み合わせる
  • 計算結果を変数へ代入する
  • 数値の符号を反転する
  • 変数の値を1増やしたり1減らしたりする
  • 条件に応じて使用する値を選ぶ

このようなデータ操作の中心になるのが、式と演算子です。

ただし、式や演算子だけを覚えても、C言語のコードを正確に読み解くのは難しいかもしれません。演算子が操作する対象であるオペランドや、式を実行できる形にした式文についても、一緒に理解することが大切です。

ここでは、次の4つのキーワードを中心に、C言語の演算の仕組みを見ていきましょう。

  • 式文
  • 演算子
  • オペランド

演算を理解するための4つのキーワード

C言語の演算を理解するときは、式、式文、演算子、オペランドの関係を整理することが大切です。

用語意味
値を表したり、新しい値を作ったりするものvalue + 5、result = value
式文式の末尾にセミコロンを付けた文result = value + 5;
演算子計算や比較などの操作を表す記号+、-、*、/、=、>、&&
オペランド演算子によって操作される対象value、5、value + 5

たとえば、次のコードを見てみましょう。

total = price + tax;

このコードには、次の要素が含まれています。

  • priceとtaxは、+によって操作されるオペランド
  • +は、2つの値を加算する演算子
  • price + taxは、加算結果を作る式
  • totalとprice + taxは、=によって操作されるオペランド
  • =は、右辺の値を左辺へ代入する演算子
  • total = price + taxは、代入式
  • 末尾にセミコロンが付いた行全体は、式文

このように、1行の中に複数の演算子や式が含まれることもあります。

図1:式・式文・演算子・オペランドの関係

この図から分かること

priceとtaxは、加算演算子+によって操作されるオペランドです。この2つを+で結ぶことで、price + taxという式が作られます。

さらに、その計算結果を代入演算子=によってtotalへ代入します。total = price + taxは代入式であり、末尾にセミコロンを付けることで式文になります。

演算子、オペランド、式、式文は、それぞれ独立したものではなく、互いに関係しながらC言語の処理を作っています。

式とは

式は、C言語で値を表したり、計算によって新しい値を作ったりするものです。

式というと、a + bのような計算だけを思い浮かべるかもしれません。しかし、C言語では定数、変数、代入、関数呼び出しなども式として扱われます。

代表的な式を整理すると、次のようになります。

式の種類内容
整数定数250整数の値を表す
文字定数'M'1文字を表す
文字列リテラル"SYSTEM"複数の文字からなる文字列を表す
変数count変数に格納されている値を表す
演算を含む式count + 5加算によって新しい値を作る
代入式result = countcountの値をresultへ代入する
複数の演算を含む式total = price + fee加算結果をtotalへ代入する
関数呼び出しsqrt(25.0)関数を呼び出して結果を得る

たとえば、次の式を考えてみましょう。

count + 5

countの値が10であれば、この式の結果は15です。

countの値:10
加算する値:5
式の結果:15

式は、計算によって値を作るだけではありません。変数countだけでも、その変数に格納されている値を表す式になります。

代入も式として扱われる

C言語では、変数へ値を入れる代入も式です。代入には、代入演算子=を使います。

score = 80

この式では、右辺の80が左辺の変数scoreへ代入されます。

代入式の基本的な形は次のとおりです。

代入先の変数 = 代入する値

右辺には、定数だけでなく、変数や計算を含む式も指定できます。

int score;
int bonus;

score = 80;
bonus = score;
score = score + 10;

それぞれの代入は、次のように処理されます。

  • score = 80; は80をscoreへ代入する
  • bonus = score; はscoreの値をbonusへ代入する
  • score = score + 10; は現在のscoreに10を加え、その結果をscoreへ代入する

最後の式では、右辺にあるscoreの値を使って加算し、その計算結果で同じ変数scoreの値を更新しています。

代入は、計算結果を変数に保存して、あとから別の処理で使えるようにするための基本的な操作です。

代入式の左辺と右辺

代入演算子=の左側を左辺、右側を右辺と呼びます。

total = price + fee;

この代入式では、次のように分けられます。

左辺:total
右辺:price + fee

処理の順番は、右辺の計算が先です。

  1. priceの値を取り出す
  2. feeの値を取り出す
  3. price + feeを計算する
  4. 計算結果をtotalへ代入する

たとえばpriceが1200、feeが200の場合は、次のようになります。

price + fee
1200 + 200
1400

最後に、計算結果の1400がtotalへ代入されます。

式文とは

式文は、式の末尾にセミコロンを付けた文です。

たとえば、次の代入式だけでは末尾にセミコロンがありません。

answer = 6 + 4

この式にセミコロンを付けると、式文になります。

answer = 6 + 4;

この式文が実行されると、次の順番で処理が進みます。

  1. 右辺の6 + 4が計算される
  2. 計算結果として10が作られる
  3. 10が変数answerへ代入される

式が値を作る仕組みであるのに対して、式文はその式をプログラムの文として実行できる形にしたものです。

初期化と式文の違い

変数の宣言と同時に値を設定することを初期化といいます。

int answer = 6 + 4;

この行では、6 + 4の部分が式です。式の計算結果である10を使って、変数answerを初期化しています。

ただし、行全体は変数を宣言しているため、式文ではなく宣言です。

変数を先に宣言し、そのあとで値を代入すると、次のようになります。

int answer;

answer = 6 + 4;

1行目は変数answerの宣言です。

2行目のanswer = 6 + 4; は、代入式にセミコロンを付けた式文です。

関数呼び出しも式になる

C言語では、関数の呼び出しも式として扱われます。

printf("%d\n", answer)

printfの呼び出しは式です。末尾にセミコロンを付けると、式文として実行できます。

printf("%d\n", answer);

この式文が実行されると、変数answerの値が画面に表示されます。

printfのほかにも、値を返す関数の呼び出しは式の中で利用できます。

sqrt(25.0)

sqrt(25.0)は、25.0の平方根を求める関数呼び出しです。この関数呼び出しによって得られた値を、別の計算や代入に利用できます。

この行では、sqrt(25.0)によって得られた値をresultへ代入しています。

演算子とは

演算子は、式の中でどのような操作を行うのかを示す記号です。

たとえば、加算演算子+は2つの値を足し、減算演算子-は左側の値から右側の値を引きます。

よく使われる算術演算子には、次のものがあります。

演算子意味式の例処理内容
+加算a + baとbを足す
-減算a - baからbを引く
*乗算a * baとbを掛ける
/除算a / baをbで割る

aとbが次の値だったとします。

a:9
b:4

それぞれの演算結果は次のようになります。

結果
a + b13
a - b5
a * b36
a / b2

aとbがどちらもint型の場合、a / bの結果もint型になります。そのため、9 ÷ 4の数学的な答えは2.25ですが、小数部分が切り捨てられて2になります。

演算子には算術演算子だけでなく、値を比較する関係演算子や、条件を組み合わせる論理演算子などもあります。

まずは、演算子はオペランドに対して何らかの操作を行う記号だと覚えておきましょう。

オペランドとは

オペランドは、演算子によって操作される対象です。

次の式では、aと10がオペランドです。

a + 10
左側のオペランド:a
演算子:+
右側のオペランド:10

変数や定数だけでなく、別の式がオペランドになることもあります。

total = a + b

この代入式では、代入演算子=から見ると、オペランドは次の2つです。

左側のオペランド:total
右側のオペランド:a + b

右側のa + bは、それ自体が1つの式です。同時に、代入演算子=によって操作されるオペランドでもあります。

さらに、a + bの中では、aとbが加算演算子+のオペランドになっています。

このように、式の中に別の式が含まれると、式そのものがオペランドとして扱われます。

単項演算子・2項演算子・3項演算子

演算子は、操作に必要なオペランドの数によって分類できます。

種類必要なオペランド数式の例主な処理
単項演算子1つ-a、++count1つの値を操作する
2項演算子2つa + b、x * y2つの値を使って計算する
3項演算子3つ(a > b) ? a : b条件によって値を選ぶ

単項演算子

単項演算子は、1つのオペランドに対して操作を行います。

符号を反転する単項演算子-は、次のように使います。

-a

aの値が5の場合、-aの結果は-5です。

aの値:5
-aの結果:-5

インクリメント演算子++は、変数の値を1増やします。

++count

countの値が7の場合、++countによって値は8になります。

単項演算子では、演算の対象となるオペランドが1つだけです。

2項演算子

2項演算子は、2つのオペランドを使って演算します。

a + b

この式では、aとbの2つがオペランドで、+が2項演算子です。

算術演算子の+、-、*、/や、代入演算子=は、2つのオペランドを必要とする2項演算子です。

result = a + b

この式では、まずa + bが計算されます。そのあと、代入演算子=によって計算結果がresultへ代入されます。

3項演算子

3項演算子は、3つのオペランドを使用します。C言語で使われる3項演算子は、条件演算子です。

基本的な形は次のとおりです。

条件式 ? 真の場合の値 : 偽の場合の値

たとえば、2つの値から大きい方を選ぶ場合は、次のように書けます。

(a > b) ? a : b

この式は、次の順番で値を選びます。

  • a > bが真の場合はaを結果にする
  • a > bが偽の場合はbを結果にする

aが9、bが4の場合、a > bは真です。そのため、式全体の結果はaの値である9になります。

図2:項の数による演算子の分類

この図から分かること

単項演算子、2項演算子、3項演算子の違いは、演算に必要なオペランドの数です。

-aでは、操作されるオペランドはaだけなので、-は単項演算子です。a + bではaとbの2つを使うため、+は2項演算子です。

条件演算子では、条件式、条件が真のときの値、条件が偽のときの値という3つのオペランドを使います。

式と式文をプログラムで確認しよう

ここまで確認した式、式文、演算子、オペランドを、1つのプログラムで確認してみましょう。

次のプログラムでは、2つの整数に対して算術演算を行います。さらに、単項演算子で符号を反転し、3項演算子で大きい方の値を選びます。

2つの整数を使って式と演算子の働きを確認するプログラム

ファイル名:6_1_2.c

#include <stdio.h>

int main(void)
{
    int first = 9;
    int second = 4;
    int addition;
    int subtraction;
    int multiplication;
    int division;
    int negative_first;
    int larger_value;

    /* 2項演算子で計算し、結果を変数へ代入する */
    addition = first + second;
    subtraction = first - second;
    multiplication = first * second;
    division = first / second;

    /* 単項演算子で符号を反転する */
    negative_first = -first;

    /* 3項演算子で大きい方の値を選ぶ */
    larger_value = (first > second) ? first : second;

    printf("first=%d, second=%d\n", first, second);
    printf("加算 first+second=%d\n", addition);
    printf("減算 first-second=%d\n", subtraction);
    printf("乗算 first*second=%d\n", multiplication);
    printf("除算 first/second=%d\n", division);
    printf("符号反転 -first=%d\n", negative_first);
    printf("大きい方=%d\n", larger_value);

    return 0;
}
実行結果の例
first=9, second=4
加算 first+second=13
減算 first-second=5
乗算 first*second=36
除算 first/second=2
符号反転 -first=-9
大きい方=9

変数の宣言と初期化

最初に、計算で使用する2つの変数firstとsecondを宣言しています。

int first = 9;
int second = 4;

宣言と同時に値を設定しているため、この処理は初期化です。

そのあとに、計算結果を保存する変数を宣言しています。

int addition;
int subtraction;
int multiplication;
int division;
int negative_first;
int larger_value;

これらの変数には、後ろにある式文の実行結果が代入されます。

2項演算子を使った式

加算は、次の式文で行っています。

addition = first + second;

この1行の処理は、次のように進みます。

  1. firstの値9を取り出す
  2. secondの値4を取り出す
  3. 2項演算子+で9と4を加算する
  4. 加算結果の13を作る
  5. 代入演算子=で13をadditionへ代入する

first + secondが加算の式です。addition = first + secondは代入式であり、末尾にセミコロンが付いているため、行全体は式文です。

減算、乗算、除算も同じ形で処理しています。

subtraction = first - second;
multiplication = first * second;
division = first / second;

それぞれの結果は次のとおりです。

計算変数へ代入される値
first + second9 + 413
first - second9 - 45
first * second9 × 436
first / second9 ÷ 42

firstとsecondはどちらもint型です。そのため、first / secondの計算では小数部分が残らず、結果は2になります。

単項演算子による符号反転

次の式文では、firstの符号を反転しています。

negative_first = -first;

-firstの-は単項演算子です。操作するオペランドはfirstの1つだけです。

firstの値は9なので、-firstの結果は-9になります。その結果がnegative_firstへ代入されます。

firstの値:9
-firstの結果:-9
negative_firstへ代入される値:-9

この処理によってfirstの値そのものが-9に変更されるわけではありません。-firstという式によって-9という値が作られ、その値がnegative_firstへ格納されます。

3項演算子による値の選択

次の式文では、firstとsecondのうち、大きい方の値を選んでいます。

larger_value = (first > second) ? first : second;

条件部分はfirst > secondです。

firstは9、secondは4なので、9 > 4は真になります。そのため、?の直後にあるfirstが選ばれます。

条件:first > second
判定:真
選ばれる値:first
結果:9

選ばれた9は、代入演算子=によってlarger_valueへ代入されます。

もしfirstがsecond以下であれば、:の後ろにあるsecondが選ばれます。

printfの呼び出しも式文

計算結果の表示にはprintfを使っています。

printf("加算 first+second=%d\n", addition);

printfの関数呼び出しは式です。末尾にセミコロンを付けることで式文となり、画面への表示処理が実行されます。

プログラムには複数のprintfがありますが、それぞれが独立した式文です。

printf("減算 first-second=%d\n", subtraction);
printf("乗算 first*second=%d\n", multiplication);
printf("除算 first/second=%d\n", division);

式文は、計算や代入だけに使われるものではありません。関数を呼び出して処理を実行するときにも使われます。

図3:オペランドから式文が作られる流れ

この図から分かること

firstとsecondは、加算演算子+によって操作されるオペランドです。+によってfirst + secondという式が作られ、その結果として13が得られます。

次に、代入演算子=が計算結果の13をadditionへ代入します。末尾にセミコロンがあるため、addition = first + second; は式文として実行されます。

これから算術演算子、関係演算子、論理演算子などを学んでも、基本的な見方は変わりません。

  • オペランドは操作される対象
  • 演算子は操作の内容を表す記号
  • 式は演算によって値を作る
  • 式文は式をプログラムで実行できる形にする

この4つの関係を意識すると、演算子が増えても、式の構造や処理の流れを読み解きやすくなります。