16
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

かなり初心者Advent Calendar 2017

Day 2

演算子の結合性、右結合がどうとかの解説

Last updated at Posted at 2017-12-01

#演算子の結合性、右結合がどうとかの解説

##想定する読者のレベル
なんかしらのプログラミングの入門書を1/3くらい理解しているレベル

##この記事の目標
http://www.bohyoh.com/CandCPP/C/operator.html
この表に演算子の結合性が右とか左とかあるのですが、その意味を説明することです。

##交換法則、結合法則とは
https://mathwords.net/koukanhousoku
交換法則:3+7=7+3、2×4=4×2 というように、順番を交換できるという法則。
結合法則:(2+3)+5=2+(3+5)、(3×6)×2=3×(6×2)というように、かっこをどこにつけても計算結果は同じという法則。
(引用)

当たり前すぎてわざわざ法則という必要がないような気がします。上で言っていることは、数の足し算(+)は交換法則と結合法則が成り立つ。数の掛け算(×)は交換法則と結合法則が成り立つ。ということです。
数の引き算、割り算については交換法則、結合法則ともに成立しません。例えば1-2と2-1は違う値なので引き算では交換法則が成立しません。また(1-2)-3と1-(2-3)は違う値なので結合法則が成立しません。
交換法則、結合法則が成り立つがどうかは演算の種類によって変わります。

###交換法則が成立しないが結合法則は成立する例
行列の掛け算は一般に交換法則が成立しませんが結合法則は成立します。
文字列の結合(+)は例えば
"aaa" + "bbb" は"aaabbb"になるが
"bbb" + "aaa"は"bbbaaa"で別のものになり交換法則が成立しません。
しかし、
("aaa" + "bbb") + "ccc" は"aaabbbccc"
"aaa" + ("bbb" + "ccc") も"aaabbbccc"
になります。どんな文字列でも一般に結合法則が成立することがわかると思います。

ややこしいですが文字列の結合と数の足し算で同じ記号(+)を使っていますが別の演算です。

###交換法則が成立するが結合法則が成立しない例
NOR、NANDがそうです。
それぞれの定義はwikipediaなどを見ていただきたいです。
(偽 NOR 偽)NOR 真  と 偽 NOR (偽 NOR 真)は異なる値
NORは(偽NOR偽)だけが真なので、左は偽、右は真

みんなに馴染みのある演算で交換法則が成立するが結合法則が成立しないものはあまりないと思います

##結合性が右とか左とか とは
1-2-3。これを(1-2)-3と解釈するのか1-(2-3)と解釈するのかというのがあります。
実際1-2-3と書いたら常識でもプログラムでも(1-2)-3だと思われますが、これは引き算の演算(-)が左結合だということです。

一般化していうと、"なんかの演算記号"が左結合というのは
:sunny: "なんかの演算記号":cloud:"なんかの演算記号":umbrella2:
と書いた場合、ルールあるいは暗黙の了解として
(:sunny: "なんかの演算記号":cloud:)"なんかの演算記号":umbrella2:
とみなされることです。

同じように、"なんかの演算記号"が右結合というのは
:sunny: "なんかの演算記号":cloud:"なんかの演算記号":umbrella2:
と書いた場合、
:sunny: "なんかの演算記号"(:cloud:"なんかの演算記号":umbrella2:
とみなされることです。

-とか割り算とかほとんどのは左結合ですね。

###右結合の演算子なんてあるか
代入(=)は右結合です。
int x = 0;
int y = 1;
int z = 2;
として
x = y = z;と書くと、
これは
x = (y = z)とみなされます。
C言語で(x = y) = z;と書くとエラーになります。(x = y)は右のyの値になるので、
(1) = z;と同じことになって代入できないだろってエラーになります。なので右結合でないといけない。
=は、変数の代入だけではなく、+とか-と同じように、値をとる演算で、例えばint w;w = (y = 30);printf("%d",w);と書くと、30と表示されます。
##群論について
プログラミングには役に立たないと思います。
##まとめ
ほとんど全ての2項演算子は結合法則が成り立つ、つまり一応結合性は決められているけどどちらにせよ値が変わらない。あるいは左結合。

16
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?