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

回答編集履歴

2

誤字修正

2019/10/10 09:34

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  ただ、私としては、「同等である」ということを理解するには、結局`&&`や`++`の性質につてより良く理解しておく必要があり、やはり、左辺値なり、遅延評価なりを理解できるレベルではないと、難しいと思っています。ここに一つの壁があると言うことです。この同等のコードを書くことは、単純に置き換えるように見えますが、そうではありません。例えば条件部分が`Move > 0 && Move++ > 40`だった場合、少し違ったコードになります。結局の所、「なぜ同等なのか」への理解を曖昧なまま進めても、また同じ問題にぶつかるだけだと思います。
17
17
 
18
- もし、私の回答で混乱としたと感じた人がいましたら、私は「あなたはCの複雑なコードを書くレベルにも読むレベルにも達していない」と言いたいです。そのような人達に対する私のアドバイスとしては次の何れかに従うことです。
18
+ もし、私の回答で混乱としたと感じた人がいましたら、私は「あなたはCの複雑なコードを書くレベルにも読むレベルにも達していない」と言いたいです。そのような人達に対する私のアドバイスとしては次の何れかに従うことです。
19
19
 
20
20
  1. C以外の言語、とくにプログラミング初学者を意識して作られた言語からプログラミングを始めることをお勧めします。一番のお勧めは**Python**です。Pythonは複雑な書き方ができず(全くできないわけでは無いが、非常に書きにくくなっている)、また、インデントも綺麗に揃えることを強制し、書く側も読む側も大変わかりやすい言語です。それにもかかわらず、様々な分野で実用的なアプリケーションの開発に使われており、身につけておいて損にはなりません。
21
21
 

1

追記

2019/10/10 09:34

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -3,4 +3,22 @@
3
3
 
4
4
  評価(evaluation)それ自体の意味、Cは基本的に先行評価(正格評価とも言われる)であるが、`&&`と`||`と`?:`のみ遅延評価(短絡評価とも言われる)があること、これらを理解しないとCを書くことは難しいです。他にもインクリメント・デクリメントは副作用と評価値の関係を正確に理解していないと使いこなすことは不可能です。さらに深く理解するには左辺値と右辺値の関係が重要になっていきます。Cの場合はある程度曖昧でもなんとかなってしまう場合もありますが、C++ではより厳密性が増すため、まともなコードを書くことも理解することも無理でしょう。
5
5
 
6
- なお、評価の傍線が並列になっているところは順不定です。Cの仕様上、どちらが先になるかは定まらないとなっています。
6
+ なお、評価の傍線が並列になっているところは順不定です。Cの仕様上、どちらが先になるかは定まらないとなっています。
7
+
8
+ ---
9
+
10
+ 【追記】なぜ、左辺値や遅延評価などの言葉を使っているのか?
11
+
12
+ 左辺値や遅延評価などの言葉を知らないと理解ができないからではなく、左辺値や遅延評価などが理解できないとこの式を理解することはできないと私は考えるからです。言葉を知らなければ調べれば良いだけですので、知っているかどうかは重要でありません。しかし、この式を真に理解するには、左辺値や遅延評価というものをある程度の理解できなければ不可能と考えています。もし、理解できるほとどにCがわかっているのであれば、あとは言葉の意味を調べれば良いだけですし、それらも理解できるはずです。理解できなければ、Cそのものというよりプログラミングというものそのものに対して学習が不足していると思います。そのような状態では、いくらどれだけ言葉を重ねても、理解することは不可能でしょう。
13
+
14
+ ぶっちゃけ、この質問への回答はY.H.さんが最初に書いた素晴らしいコードで十分と思っていました。同等であるコードが理解できれば、元々のコードがそうなることは理解できるからです。Y.H.さんの素晴らしいコードであれば左辺値や遅延評価などを理解することができないレベルでも理解することができるでしょう。
15
+
16
+ ただ、私としては、「同等である」ということを理解するには、結局`&&`や`++`の性質につてより良く理解しておく必要があり、やはり、左辺値なり、遅延評価なりを理解できるレベルではないと、難しいと思っています。ここに一つの壁があると言うことです。この同等のコードを書くことは、単純に置き換えるように見えますが、そうではありません。例えば条件部分が`Move > 0 && Move++ > 40`だった場合、少し違ったコードになります。結局の所、「なぜ同等なのか」への理解を曖昧なまま進めても、また同じ問題にぶつかるだけだと思います。
17
+
18
+ もし、私の回答で混乱としたと感じた人がいましたら、私は「あなたにはCの複雑なコードを書くレベルにも読むレベルにも達していない」と言いたいです。そのような人達に対する私のアドバイスとしては次の何れかに従うことです。
19
+
20
+ 1. C以外の言語、とくにプログラミング初学者を意識して作られた言語からプログラミングを始めることをお勧めします。一番のお勧めは**Python**です。Pythonは複雑な書き方ができず(全くできないわけでは無いが、非常に書きにくくなっている)、また、インデントも綺麗に揃えることを強制し、書く側も読む側も大変わかりやすい言語です。それにもかかわらず、様々な分野で実用的なアプリケーションの開発に使われており、身につけておいて損にはなりません。
21
+
22
+ 2. どうしてもCにこだわるのであれば、自分が理解できる範囲でコードを一から作ることをお勧めします。`++`は使わない、`&&`はifで表現する、または、左右は変数一つのみにして単純化する、といったことをしてください。一つの文で複数のことを行おうとはしないでください。言ってみれば、Y.H.さんのコードのような形です。プログラミングとは**自分が理解できるコード**を自分で書くことです。他人が書いたコードを切り貼りすることはプログラミングとは言えません。
23
+
24
+ なお、私が開発者で同じことを実装するのであれば、Y.H.さんのコードのように書きます。中身を理解できても、ぱっと見でわからなければ、それは私にとって価値が無いコードだからです。