回答編集履歴

3

修正

2020/09/28 23:22

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- (x=y)=5 は、まず x = y が評価され、~~y の値となります~~y の値が x に代入されますそして新しい x の値が (x = y) の値となります。次に ~~(y の値)~~(x の値) = 5 が評価されますが、この時左オペランドは変更可能な左辺値ではありません。
17
+ (x=y)=5 は、まず x = y が評価され、~~y の値となります~~y の値が x に代入されますそして新しい x の値が (x = y) の値となります。次に ~~(y の値)~~(x の値) = 5 が評価されますが、この時左オペランドは変更可能な左辺値ではありません。
18
18
 
19
19
 
20
20
 

2

修正

2020/09/28 23:22

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- (x=y)=5 は、まず x = y が評価され、y の値となります。次に (y の値) = 5 が評価されますが、この時左オペランドは変更可能な左辺値ではありません。
17
+ (x=y)=5 は、まず x = y が評価され、~~y の値となります~~y の値が x に代入されますそして新しい x の値が (x = y) の値となります。次に ~~(y の値)~~(x の値) = 5 が評価されますが、この時左オペランドは変更可能な左辺値ではありません。
18
18
 
19
19
 
20
20
 
@@ -30,6 +30,6 @@
30
30
 
31
31
 
32
32
 
33
- まず y = 5 が評価されます。y は変更可能な左辺値なので、y に 5 が代入され、評価値は 5 になります。次に x = (評価値 = 5) が評価されます。この時 x は変更可能な左辺値なので、x に 5 が代入され、評価値は 5 になります。
33
+ まず y = 5 が評価されます。y は変更可能な左辺値なので、y に 5 が代入され、評価値は y の値である 5 になります。次に x = 5 が評価されます。この時 x は変更可能な左辺値なので、x に 5 が代入され、評価値は 5 になります。
34
34
 
35
35
  カッコがなかった場合、代入演算子は右結合なので、x = y = 5 は x = (y = 5) と同じ演算順序になります。

1

追記

2020/09/28 21:14

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -15,3 +15,21 @@
15
15
 
16
16
 
17
17
  (x=y)=5 は、まず x = y が評価され、y の値となります。次に (y の値) = 5 が評価されますが、この時左オペランドは変更可能な左辺値ではありません。
18
+
19
+
20
+
21
+ > 6.3.2.1 左辺値,配列及び関数指示子 左辺値(lvalue)は,オブジェクト型,又はvoid以外の不完全型をもつ式とする(53)。左辺値が評価されたときにオブジェクトを指し示していなければ,動作は未定義とする。オブジェクトがもつ型に言及する場合,その型とは,オブジェクトを指し示すために用いる左辺値によって指定される型とする。変更可能な左辺値(modifiable lvalue)とは,配列型をもたず,不完全型をもたず, const修飾型をもたない左辺値とし,それが構造体又は共用体の場合,const修飾型のメンバ(再帰的に包含されているすべての集成体又は共用体の任意のメンバ又は要素を含めて)をもたないものとする。
22
+
23
+
24
+
25
+ 演算順序を変えて次のようにした場合、
26
+
27
+
28
+
29
+ x = (y = 5)
30
+
31
+
32
+
33
+ まず y = 5 が評価されます。y は変更可能な左辺値なので、y に 5 が代入され、評価値は 5 になります。次に x = (評価値 = 5) が評価されます。この時 x は変更可能な左辺値なので、x に 5 が代入され、評価値は 5 になります。
34
+
35
+ カッコがなかった場合、代入演算子は右結合なので、x = y = 5 は x = (y = 5) と同じ演算順序になります。