涼の成長記録

自らの人生に主導権を持つべく、独立を目指して2014年3月31日を持ってITエンジニアを退職。そんな23歳♂の成長記録。

除算乗算代入演算子と乗算除算代入演算子について

C言語等で、"加算代入演算子[+=]"というものがあります。

int a = 8;
int b = 16;
a += b;

とすると、aの値は24になります。左オペランドの値に右オペランドを加算した値を、左オペランドに代入する演算子です。これはメジャーな演算子なのですが、この仲間の演算子で、マイナーな"除算乗算代入演算子(/*=)"、"乗算除算代入演算子(*/=)"というものがあります。ご存知でしたか?


例えば以下のようなプログラムがあります。

int a = 8;
int b = 16;
a */= b;

オペランドの値に右オペランドの値を乗算して、さらに除算して、左オペランドに代入する演算子です。当然aの値は変わらず8のままだということです。乗算した値と同じ値で除算するのですからね。


そんな演算子を利用して、適当なプログラムを組んでみるのですが、どうやら実行結果が期待と異なります。

プログラム

#include <stdio.h>

int main(void) {
    int a = 8
    int b = 16;

    a /*= 10;
    b */= 16;

    printf("a = %d, b = %d\n", a, b);
    return 0;
}

実行結果

a = 16, b = 16


おかしいですね。aの値は8になるはずです。(8 × 10 ÷ 10)は8です。16ではありません。bの値は正しいようですね。(16 ÷ 16 × 16)は16です。しかし、何故aは期待通りの値にならないのでしょうか。除算乗算代入演算子と、乗算除算代入演算子の効果は異なるのでしょうか?さあ、よく考えてみましょう。









おや、ギブアップでしょうか?







仕方ありませんね。







その答えは、シンタックスハイライトしてみると分かります。

#include <stdio.h>

int main(void) {
    int a = 8
    int b = 16;

    a /*= 3;
    b */= 5;

    printf("a = %d, b = %d\n", a, b);
    return 0;
}

除算乗算代入演算子、乗算除算代入演算子なんて、現在どの言語にも存在しません。くだらないネタにお付き合い頂き、ありがとうございました。
いやー、プログラミングって面白いですね!
ではでは。