

四則演算の演算子や代入演算子など二項演算子については  
結合順序(左から右、右から左)が意味をなす場面が想像しやすいのですが、  
単項演算子の結合順序が意味をなす場面が想像しにくいです。

どのような場合に意味があるのでしょうか？

例えば、単項マイナスは

[code]

    -1-1
    
[/code]

の場面に結合順序が意味をなしそうですが、  
実際には後者のマイナスは二項演算子のマイナスで、  
優先順位(単項マイナス>二項演算子の減算)に従っているだけなので、  
単項マイナスの結合順序はこの場合関係無いと思われます。

また、同様にインクリメント、デクリメント演算子の結合順序がどのような時に意味があるのか良く分かりません。

x++が「評価してから1加える」のと、  
++xが「1加えてから評価する」という違いに現れているのかとも思いましたが、  
C言語入門 (ASCII SOFTWARE SCIENCE Language)によると、  
「結合順序は優先順位が同一順位の演算子をCが評価する時の順序」  
としているので、この場合には当てはまらないと考えられます。


CC BY-SA 3.0
2017-10-30T02:00:22.500
39135
2017-10-30T07:17:23.340
2017-10-30T07:17:23.340
25791
25791
question
c
単項演算子の結合順序の意味について


単項演算子が２つ以上重ねられた際に意味があるのでは？

[code]

    int i = 10;
    printf("%d\n", !!i);
    
[/code]

`i`が評価され`10`が得られます。次に`!i`で`0`になります。最後に`!!i`で`1`になります。自然な流れになるように前置単項演算子は右から、後置単項演算子は左からとなっているだけかと。


CC BY-SA 3.0
2017-10-30T02:38:04.317
39136
2017-10-30T06:17:50.133
2017-10-30T06:17:50.133
4236
4236
39135
answer


単項演算子の場合は、演算子の対象が片側にしかないのですから、その対象側から結合するしかありません。例えば、間接演算子 `*` で`*p`
と書いたとき、左結合にしたくても、左側にはオペランドがないので、結合しようがありません。


CC BY-SA 3.0
2017-10-30T03:19:32.097
39139
2017-10-30T03:19:32.097
3605
39135
answer


nekketsuuuさんのコメントのリンク先を元に自己回答してみます。  
他にもコメントがあれば、修正していきたいので、何か意見があればお願いします。

インクリメント、デクリメントでは例えば

[code]

    ++*y
    
[/code]

のような場合に結合順序が意味をなす。(prefixの++も*も同じ優先順位)

左結合ならば

[code]

    (++*)y
    
[/code]

と同義となる。

この場合、*がオペランドとして++を許容するか、もしくは++*という右結合のオペレーターが無い限りエラーになる。

一方、右結合ならば

[code]

    ++(*y)
    
[/code]

と同義となる。

実際*と++は右結合なので、ポインタ先の変数をインクリメントして評価する事になる。


CC BY-SA 3.0
2017-10-30T05:20:51.087
39143
2017-10-30T05:20:51.087
25791
39135
answer