C言語 謎解き 演算子 1(基本算術演算子)
記憶が定かでないのですが、その昔に大学?もしくは仕事関係?の方に頂いた、C言語の謎解き問題集です。プログラムの実行結果がどうなるかを考えるというものです。C言語の文法や仕様をきちんと理解していないと解けないので、理解度を確認するのにぴったりです。
問題集とは言ってもソースコードしか無いので、コンパイル&実行した結果と簡単な解説も記載したいと思います。元のプログラムはC89(ANSI C)だと思われるので、現在のPC環境で実行することを念頭にC99に準拠するように一部を書き換えています。なお、私の実行環境はWin10(x86_64) + Clangですが、gccでも同じ結果になると思います。間違いなどがありましたらご指摘ください。
では、早速問題です。
次のプログラムの実行結果はどうなるでしょうか?
#include <stdio.h>
int main(void)
{
int x;
x = - 3 + 4 * 5 - 6;
printf("%d\n", x); // 演算子 1.1
x = 3 + 4 % 5 - 6;
printf("%d\n", x); // 演算子 1.2
x = - 3 * 4 % - 6 / 5;
printf("%d\n", x); // 演算子 1.3
x = ( 7 + 6 ) % 5 / 2;
printf("%d\n", x); // 演算子 1.4
return 0;
}
Linux kernel の一部分
実行結果(operators_1.c)※
PS C:\Users\xxx\Documents\C> ./operators_1.exe
11
1
0
1
(右上の + マークをクリックすると実行結果が表示されます)
まずは小手調べといったところですが、全問正解できましたか?
解説
演算子 1.1
x = - 3 + 4 * 5 - 6
x = (-3) + 4 * 5 - 6 ---(1)
x = (-3) + (4 * 5) - 6 ---(2)
x = ((-3) + (4 * 5)) - 6 ---(3)
x = (((-3) + (4 * 5)) - 6) ---(4)
(x = (((-3) + (4 * 5)) - 6)) ---(5)
(x = ((-3 + (4 * 5)) - 6)))
(x = ((-3 + 20) - 6))
(x = (17 - 6))
x = 11
( )を使って演算順を明確にしていきます。
(1)演算子の優先順(参照:C言語の演算子と優先順位)に従うと、最も優先順が高いのは単項演算子の ― です。
(2)次に優先が高い演算子は * です。
(3)加減演算子 + と - の優先順位は同じです。優先順位が同じ場合の順序は結合法則に依存します。+ と - の結合法則は左から右ですから + が先です。
(4)その次が - 。
(5)最後が代入演算子 = です。
あとは、順に計算していきます。
演算子 1.2
x = 3 + 4 % 5 - 6
x = 3 + (4 % 5) - 6 ---(1)
x = (3 + (4 % 5)) - 6 ---(2)
x = ((3 + (4 % 5)) - 6) ---(3)
(x = ((3 + (4 % 5)) - 6)) ---(4)
(x = ((3 + 4) - 6)) ---(5)
(x = (7 - 6))
x = 1
1.1と同様に演算子の優先順に従って演算順を( )を使って明確にしていきます。
(1)最も優先順が高いのは剰余算の %
(2)加減演算子 + と - の優先順位は同じで結合法則は左から右なので、+ が先。
(3)次に - 。
(4)最後が代入演算子 = 。
(5)あとは順に計算していきます。4 ÷ 5 の余りは 4 ですね。
演算子 1.3
x = - 3 * 4 % - 6 / 5
x = (-3) * 4 % (-6) / 5 ---(1)
x = ((-3) * 4) % (-6) / 5 ---(2)
x = (((-3) * 4) % (-6)) / 5
x = ((((-3) * 4) % (-6)) / 5)
(x = ((((-3) * 4) % (-6)) / 5))
(x = (((-3 * 4) % -6) / 5))
(x = ((-12 % -6) / 5))
(x = (0 / 5))
x=0
前問までと同様に演算子の優先順に( )で括っていきます。
(1)最も優先順が高いのは単項演算子 - 。
(2)乗除演算子 * % / は優先順は同じで結合法則が左から右なので、最初は * 。
(3)次に % 。
(4)その次に / 。
(5)最後に代入演算子 = 。
あとは順に計算していきます。
演算子 1.4
x = ( 7 + 6 ) % 5 / 2 ---(1)
x = ((7 + 6) % 5) / 2 ---(2)
x = (((7 + 6) % 5) / 2) ---(3)
(x = (((7 + 6) % 5) / 2)) ---(4)
(x = ((13 % 5) / 2))
(x = (3 / 2)) ---(5)
x = 1
同様に演算子の優先順に( )で括ります。
(1)( )があるので、この加算が最初です。
(2)乗除演算子 % / は優先順は同じで結合法則が左から右なので、最初は % 。
(3)次に / 。
(4)最後に代入演算子 = 。
あとは順に計算していきます。
(5)整数同士の割り算では小数点以下は切り捨てになるので 3 / 2 は 1 になります。
(右上の + マークをクリックすると解説が表示されます)
※実行環境
clang version 14.0.6
Target: x86_64-pc-windows-msvc
コメント