質問するログイン新規登録

回答編集履歴

4

修正

2018/12/07 14:01

投稿

LouiS0616
LouiS0616

スコア35680

answer CHANGED
@@ -25,7 +25,7 @@
25
25
  他言語では
26
26
  ---
27
27
  Javaのように、オペランドの評価順が規定されている言語もあります。
28
- そのばあい、a++ を複数箇所に埋め込むことは実験として意味を持ちます。
28
+ その場合、a++ を複数箇所に埋め込むことは実験として意味を持ちます。
29
29
  ```Java
30
30
  class Main {
31
31
  public static void main(String[] args) { // ← main関数に相当

3

追記

2018/12/07 14:01

投稿

LouiS0616
LouiS0616

スコア35680

answer CHANGED
@@ -17,7 +17,35 @@
17
17
 
18
18
  なお
19
19
  ---
20
- `b = square(a+1);`の結果を見てみると面白いと思います。
20
+ b = square(a+1); の結果を見てみると面白いと思います。
21
21
  これは未定義動作を踏んでいませんので、予想及び結果の考察をしてみると学ぶものがあると思います。
22
22
 
23
- マクロはトラブルを招きやすいので、一般の関数で充分代替できるときに使うものではありません。
23
+ マクロはトラブルを招きやすいので、一般の関数で充分代替できるときに使うものではありません。
24
+
25
+ 他言語では
26
+ ---
27
+ Javaのように、オペランドの評価順が規定されている言語もあります。
28
+ そのばあい、a++ を複数箇所に埋め込むことは実験として意味を持ちます。
29
+ ```Java
30
+ class Main {
31
+ public static void main(String[] args) { // ← main関数に相当
32
+ int a = 2;
33
+ int b = a++ * a++;
34
+ System.out.printf("a=%d, b=%d\n", a, b); // ← printfに相当
35
+ }
36
+ }
37
+ ```
38
+
39
+ **実行結果** [Wandbox](https://wandbox.org/permlink/QQBSpLWogExpywyP)
40
+ ```
41
+ a=4, b=6
42
+ ```
43
+
44
+ 処理の順序は次のとおりです。
45
+ 0. オペレータ * の左辺が評価され、aの値2を返す。その後、aの値は3になる。
46
+ 0. オペレータ * の右辺が評価され、aの値3を返す。その後、aの値は4になる。
47
+ 0. 掛け算が実行される。
48
+ 0. bに掛け算の結果の値6が代入される。
49
+
50
+ ご提示のコードの場合も、同じように処理されたという**解釈は**可能です。
51
+ しかしあくまで人間の解釈の域を出ないことにはご留意を。

2

追記

2018/12/07 14:00

投稿

LouiS0616
LouiS0616

スコア35680

answer CHANGED
@@ -6,7 +6,18 @@
6
6
  このような式はC言語では未定義の動作ですので、b=6になる理由は**ありません**。
7
7
 
8
8
  ---
9
+ やりがちなミスですので、警告レベルを適切に設定すればコンパイラが叱ってくれます。
10
+ 例えばgccの場合はこのような警告です。[Wandbox](https://wandbox.org/permlink/2XLZLYU51jKf0SYN)
11
+
12
+ ```
13
+ warning: operation on 'a' may be undefined [-Wsequence-point]
14
+ b=square(a++);
15
+ ~^~
16
+ ```
17
+
18
+ なお
19
+ ---
9
- なお、`b = square(a+1);`の結果を見てみても面白いと思います。
20
+ `b = square(a+1);`の結果を見てみると面白いと思います。
10
21
  これは未定義動作を踏んでいませんので、予想及び結果の考察をしてみると学ぶものがあると思います。
11
22
 
12
23
  マクロはトラブルを招きやすいので、一般の関数で充分代替できるときに使うものではありません。

1

追記

2018/12/07 13:31

投稿

LouiS0616
LouiS0616

スコア35680

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