回答編集履歴

2

未定義動作に関する記述を追加

2019/09/26 03:37

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -53,3 +53,51 @@
53
53
  y、r、*p、a[2] の右辺値はすべて 5 です。
54
54
 
55
55
  もちろん、定数 5 は右辺値です。
56
+
57
+
58
+
59
+ **追記**
60
+
61
+ (y = 5) = x は文法上エラーにはなりませんが、未定義動作だと思います。
62
+
63
+
64
+
65
+ 代入演算子には、
66
+
67
+ ・評価結果の値を返す
68
+
69
+ ・左オペランドの値を変更するという副作用
70
+
71
+ の 2つの機能があります。
72
+
73
+
74
+
75
+ 副作用の完了は、(y = 5) = x という完結式(full-expression) を
76
+
77
+ 評価し終わった後でよいことになっています。
78
+
79
+
80
+
81
+ 部分式(subexpression) である (y = 5) の評価では、
82
+
83
+ 評価結果が y であることが確定するだけで、
84
+
85
+ y の値が 5 に変更されていることは保証されません。
86
+
87
+
88
+
89
+ 一つの完結式の中で、同じ変数 y を、5 にする副作用と、x の値にする副作用の
90
+
91
+ 2つがあって、どちらを先に行うかという規定はありません。
92
+
93
+
94
+
95
+ i = ++i + 1; や i = i++ + 1; なども
96
+
97
+ 変数 i の変更が一つの完結式の中で 2つあるので未定義動作です。
98
+
99
+
100
+
101
+ x = (y = 3) + (y = 5); も変数 y の変更が一つの完結式の中で
102
+
103
+ 2つあるので未定義動作です。

1

記述ミスの修正

2019/09/26 03:36

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  x = (y = 5) において x = の代入演算子の右辺に (y = 5) があります。
30
30
 
31
- C では、(y = 5) の評価結果が右辺値 5 なので、エラーになりま
31
+ C では、(y = 5) の評価結果が右辺値 5 なので、エラーになりません
32
32
 
33
33
  C++ では、(y = 5) の評価結果が左辺値 y なのですが、
34
34