回答編集履歴

4

修正

2018/12/07 14:01

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  Javaのように、オペランドの評価順が規定されている言語もあります。
54
54
 
55
- そのばあい、a++ を複数箇所に埋め込むことは実験として意味を持ちます。
55
+ その場合、a++ を複数箇所に埋め込むことは実験として意味を持ちます。
56
56
 
57
57
  ```Java
58
58
 

3

追記

2018/12/07 14:01

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -36,10 +36,66 @@
36
36
 
37
37
  ---
38
38
 
39
- `b = square(a+1);`の結果を見てみると面白いと思います。
39
+ b = square(a+1); の結果を見てみると面白いと思います。
40
40
 
41
41
  これは未定義動作を踏んでいませんので、予想及び結果の考察をしてみると学ぶものがあると思います。
42
42
 
43
43
 
44
44
 
45
45
  マクロはトラブルを招きやすいので、一般の関数で充分代替できるときに使うものではありません。
46
+
47
+
48
+
49
+ 他言語では
50
+
51
+ ---
52
+
53
+ Javaのように、オペランドの評価順が規定されている言語もあります。
54
+
55
+ そのばあい、a++ を複数箇所に埋め込むことは実験として意味を持ちます。
56
+
57
+ ```Java
58
+
59
+ class Main {
60
+
61
+ public static void main(String[] args) { // ← main関数に相当
62
+
63
+ int a = 2;
64
+
65
+ int b = a++ * a++;
66
+
67
+ System.out.printf("a=%d, b=%d\n", a, b); // ← printfに相当
68
+
69
+ }
70
+
71
+ }
72
+
73
+ ```
74
+
75
+
76
+
77
+ **実行結果** [Wandbox](https://wandbox.org/permlink/QQBSpLWogExpywyP)
78
+
79
+ ```
80
+
81
+ a=4, b=6
82
+
83
+ ```
84
+
85
+
86
+
87
+ 処理の順序は次のとおりです。
88
+
89
+ 0. オペレータ * の左辺が評価され、aの値2を返す。その後、aの値は3になる。
90
+
91
+ 0. オペレータ * の右辺が評価され、aの値3を返す。その後、aの値は4になる。
92
+
93
+ 0. 掛け算が実行される。
94
+
95
+ 0. bに掛け算の結果の値6が代入される。
96
+
97
+
98
+
99
+ ご提示のコードの場合も、同じように処理されたという**解釈は**可能です。
100
+
101
+ しかしあくまで人間の解釈の域を出ないことにはご留意を。

2

追記

2018/12/07 14:00

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -14,7 +14,29 @@
14
14
 
15
15
  ---
16
16
 
17
+ やりがちなミスですので、警告レベルを適切に設定すればコンパイラが叱ってくれます。
18
+
19
+ 例えばgccの場合はこのような警告です。[Wandbox](https://wandbox.org/permlink/2XLZLYU51jKf0SYN)
20
+
21
+
22
+
23
+ ```
24
+
25
+ warning: operation on 'a' may be undefined [-Wsequence-point]
26
+
27
+ b=square(a++);
28
+
29
+ ~^~
30
+
31
+ ```
32
+
33
+
34
+
35
+ なお
36
+
37
+ ---
38
+
17
- なお、`b = square(a+1);`の結果を見てみても面白いと思います。
39
+ `b = square(a+1);`の結果を見てみると面白いと思います。
18
40
 
19
41
  これは未定義動作を踏んでいませんので、予想及び結果の考察をしてみると学ぶものがあると思います。
20
42
 

1

追記

2018/12/07 13:31

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -9,3 +9,15 @@
9
9
 
10
10
 
11
11
  このような式はC言語では未定義の動作ですので、b=6になる理由は**ありません**。
12
+
13
+
14
+
15
+ ---
16
+
17
+ なお、`b = square(a+1);`の結果を見てみても面白いと思います。
18
+
19
+ これは未定義動作を踏んでいませんので、予想及び結果の考察をしてみると学ぶものがあると思います。
20
+
21
+
22
+
23
+ マクロはトラブルを招きやすいので、一般の関数で充分代替できるときに使うものではありません。