マクロ関数について


マクロ関数について勉強しています。

以下のコードを実行すると、エラーが出てしまいます。  
解決法教えてください。

**エラーメッセージ**

[code]

    error: lvalue required as left operand of assignment
     #define ABS(x)   x >= 0 ? x = x * 1 : x = x * -1;
                                             ^
    .\5.c:9:5: note: in expansion of macro 'ABS'
         ABS(x);
         ^~~
    
[/code]

**ソースコード**

[code]

    #include <stdio.h>
    
    #define ABS(x)   x >= 0 ? x = x * 1 : x = x * -1;
    
    int main(){
        int x, y;
        scanf("%d %d", x, y);
        x += y;
        ABS(x);
        printf("%d\n", x);
        return 0;
    }
    
[/code]




マクロ関数を使っていることはエラーとは直接関係ありません。マクロを使わずに書くと`ABS(x);`の部分は次のようになりますが、これでも同じエラーが出るはずです。

[code]

    x >= 0 ? x = x * 1 : x = x * -1;
    ;
    
[/code]

ここで三項演算子の優先順位は代入演算子のそれより高いので

[code]

    (x >= 0 ? (x = x * 1) : x) = x * -1;
    
[/code]

とカッコを付けたかのように解釈されます。`(x >= 0 ? (x = x * 1) :
x)`は代入先として不適当なため、質問にあるようなエラーメッセージが表示されます。

直接的な修正としては、次のようにカッコをつけてやれば良いです。

[code]

    x >= 0 ? (x = x * 1) : (x = x * -1);
    
[/code]

参考: [C の演算子の優先順位 -
cppreference.com](https://ja.cppreference.com/w/c/language/operator_precedence)

あと今回の質問とは無関係ですが

  * `scanf`の引数
  * `ABS`マクロに余分なセミコロンがついている
  * `ABS`という名を使うのであれば、絶対値を返すことだけに集中し、代入は外でやるべき

などいくつか気になる点があります。

