はじめに
この記事について
「C言語の基礎を学ぼう」をテーマに、自身の知識 + α をアドベントカレンダーにまとめます。
25日間でC言語をマスターしよう - Qiita Advent Calendar 2025 - Qiita
こんな方を対象としています
-
コンピュータがプログラムをどのように動かしているか知りたい/知らない方
-
プログラミングをしてみたい方
-
C言語初心者の方
キーワード
-
演算子の優先順位
-
複合代入演算子
-
インクリメント/デクリメント
-
式の値
説明
演算子の優先順位
C言語には様々な演算子があります。
それぞれには優先順位があり、優先順位の高い演算が優先して実行されます。
また、それぞれ結合規則があります。
左から右に計算されるか、右から左に計算されるかが演算子ごとに決まっています。
下記に表を記載します。(上ほど優先順位が高い)
| 演算子 | 結合規則 |
|---|---|
( ) [ ]
|
→ |
-> |
← |
++(後置) --(後置) |
← |
! ~ ++(前置) --(前置) +(符号) -(符号)*(間接参照演算子) &(アドレス演算子) キャスト |
→ |
* / %
|
→ |
+ -
|
→ |
<< >>
|
→ |
< <= > >=
|
→ |
== !=
|
→ |
&(ビット積) ^ |
|
→ |
&& ||
|
→ |
?:(条件演算子) |
← |
= += -= *= /= <<= >>= &= ^= |=
|
← |
, |
→ |
この優先順位により、足し算より掛け算を優先したりかっこ内を優先して計算したりできます。
#include <stdio.h>
int main(void) {
printf("1. %d\n", 1 + 2 * 3);
printf("2. %d\n", 2 * 3 + 1);
printf("3. %d\n", (1 + 2) * 3);
return 0;
}
1. 7
2. 7
3. 9
複合代入演算子
#include <stdio.h>
int main(void) {
int a = 50;
a = a + 10; // 自身に計算後の値を代入している
printf("%d", a);
return 0;
}
60
この場合、複合代入演算子を使用することができます。
#include <stdio.h>
int main(void) {
int a = 50;
a += 10; // 複合代入演算子
printf("%d", a);
return 0;
}
60
インクリメントとデクリメント
整数値を1増やしたい/1減らしたい場合に使用する演算子に、インクリメント/デクリメントがあります。
#include <stdio.h>
int main(void) {
int a = 5, b = 5, c = 5, d = 5;
a++; // インクリメント(後置)
++b; // インクリメント(前置)
c--; // デクリメント(後置)
--d; // デクリメント(前置)
printf("a: %d\n", a);
printf("b: %d\n", b);
printf("c: %d\n", c);
printf("d: %d\n", d);
return 0;
}
a: 6
b: 6
c: 4
d: 4
プログラムを少し変えてみます。
#include <stdio.h>
int main(void) {
int a = 5, b = 5, c = 5, d = 5;
printf("a: %d\n", a++);
printf("b: %d\n", ++b);
printf("c: %d\n", c--);
printf("d: %d\n", --d);
return 0;
}
a: 5
b: 6
c: 5
d: 4
この現象の説明には 式の値 という考え方が便利です。
式の値
すべての式は 式の値 というものを持っています。
式の値を直感的に理解するには「その式が実行された 瞬間 の数値」を考えます。
int main(void) {
int a = 5;
a * 2;
return 0;
}
a * 2 の式の値はいくつでしょうか。直感でわかると思います。
確認してみましょう。
#include <stdio.h>
int main(void) {
int a = 5;
printf("%d", a * 2);
return 0;
}
10
式の値は 10 です。そのため、代入演算子と組み合わせると 10 を代入することができます。
#include <stdio.h>
int main(void) {
int a = 5, b;
b = a * 2;
printf("%d", b);
return 0;
}
10
次の例です。
int main(void) {
int a;
a = 2;
return 0;
}
a = 2 の式の値はいくつでしょうか。
確認してみましょう。
#include <stdio.h>
int main(void) {
int a;
printf("%d", a = 2);
return 0;
}
2
式の値は 2 です。つまり、こんなことも可能です。
#include <stdio.h>
int main(void) {
int a, b;
b = (a = 2);
printf("a: %d, b: %d", a, b);
return 0;
}
a: 2, b: 2
インクリメントとデクリメントは前置/後置について、それぞれ式の値が異なります。
副作用があるため、実行後の変数の値に違いが発生しません。
| 演算子 | 式の値 | 副作用 |
|---|---|---|
a++ |
a |
a+=1 |
++a |
a + 1 |
なし |
a-- |
a |
a-=1 |
--a |
a - 1 |
なし |
練習
1. 実行結果を考えよう
複雑なプログラムがある。実行結果はどうなるだろうか。
#include <stdio.h>
int main(void) {
int a = 5, b, result;
b = --a;
result = a++ + ++b;
printf("a: %d, b: %d, result: %d", a, b, result);
return 0;
}
ポイント
ひとつずつ式の値を考えます。
解答
#include <stdio.h>
int main(void) {
int a = 5, b, result;
b = --a; // b = 4, a = 4
result = a++ + ++b; // result = 4 + 5, a = 5, b = 5
printf("a: %d, b: %d, result: %d", a, b, result);
return 0;
}
a: 5, b: 5, result: 9
おわりに
式の値という概念はプログラミングにおいて非常に大切だと思っています。
複雑な式は書かないようにしたほうが、読み手にやさしいプログラムになりますね。
参考文献
↓↓↓ はじめてプログラミングを学んだときに読んだ本です ↓↓↓
詳細(プログラミング入門 C言語)|プログラミング|情報|実教出版