

C言語を勉強しているものです。

zshのソースコードリーディングを行っており、理解できない処理がありました。  
[ZSH - THE Z SHELL](http://zsh.sourceforge.net/)

[code]

    /* If not a POSIX machine, then we create our *
     * own POSIX style signal sets functions.     */
    #ifndef POSIX_SIGNALS
    # define sigemptyset(s)    (*(s) = 0)
    # define sigfillset(s)    (*(s) = ~(sigset_t)0, 0)
    # define sigaddset(s,n)    (*(s) |=  (1 << ((n) - 1)), 0)
    # define sigdelset(s,n)    (*(s) &= ~(1 << ((n) - 1)), 0)
    # define sigismember(s,n)  ((*(s) & (1 << ((n) - 1))) != 0)
    #endif   /* ifndef POSIX_SIGNALS */
    
    
    /**/
    sigset_t    signal_mask(int sig)
    {
        sigset_t set;
    
        sigemptyset(&set);
        if (sig)
            sigaddset(&set, sig);
        return set;
    }
    
[/code]

このdefineで定義されているマクロ関数sigaddsetのコンマ演算子を使用している部分が何をしているのか教えて頂きたいです。

[code]

    sigaddset(s,n)    (*(s) |=  (1 << ((n) - 1)), 0)
    
[/code]

① `1 << ((n) - 1)`  
② `*(s) = *(s) | (①の式の結果の値)`  
③ `0` # 何もされない？

となっており、最後のコンマ演算子の役割がわかりません。  
私の式の展開順序が間違っているのでしょうか。

よろしくお願いします。


CC BY-SA 4.0
2021-05-05T04:11:58.553
75675
2021-05-05T04:30:28.790
44648
question
c
C言語　マクロ関数におけるコンマ演算子の役割、define sigaddset(s,n) (*(s) |= (1 << ((n) - 1)), 0)のコンマ演算子が何をしているのか知りたい


`,`演算子は左の式を評価した後、その結果を捨て、右の式を評価するものです。

[code]

    int x = sigaddset(s,n);
    
[/code]

としたときに、`,0`がない場合`*s`の値が格納されますが、`,0`を加えることで`0`が格納されるようになります。関数の戻り値として成功を表しているのかもしれません。


CC BY-SA 4.0
2021-05-05T04:29:53.307
75676
2021-05-05T04:29:53.307
4236
75675
answer


sigaddset は関数の仕様として、成功すれば 0 を、エラーの場合は -1 を返す、と定められているのだと思います。


CC BY-SA 4.0
2021-05-05T04:30:28.790
75677
2021-05-05T04:30:28.790
45045
75675
answer