KuwataさんのTwitter経由で知った https://twitter.com/genkuroki/status/1145698996033167360/ に貼ってあったスクリーンショット画像。
"AtheOS@技術者育成中(進行形)"さんが返信で言いたいことは、おそらく:
for (int j = 0; j < 5; j++) { for (int i = 0; i < 4; i++) { なにか; } }
for (int j = 0; j < 4; j++) { for (int i = 0; i < 5; i++) { なにか; } }
「上の2つのコードで表現される処理は違うよ」ってことでしょう。それ自体はまったく正しいことです。上記2つのコードの実行は、違った処理過程になりますし、処理結果も違うかも知れません(同じときもあります)。
しかし、それを根拠に「5×4 と 4×5 を区別するよう教育せよ」と主張しているところが、理解しがたい*1。
ここで断っておきますが、「5×4 と 4×5 を区別せよ」論者に対して、懇切な説明や説得を試みる気はありません。「5×4 と 4×5 を区別せよ」を本気で主張している人を説得できる可能性は低いでしょう。説得可能だとしても、とても労力がかかるでしょう。-- 不毛。
感じたこと/思ったことをパラパラと書くだけです。
まず、“順序区別論者”に対して「交換法則があるでしょ」と言っても意味ないですね。「掛け算の順序を区別せよ」と言ってるだけで、交換法則を否定してるわけじゃないですから。
「5個/袋 × 4袋」と「4個/袋 × 5袋」は違うとか、「5km/時間 × 4時間」と「4km/時間 × 5時間」は違うとかが、背後にある状況が違うでしょ、ってことならその通りで異論はないです。むしろ、背後にある状況の違いはシッカリ認識すべきだと思います。
4回の繰り返し(内側ループ)を5回繰り返す(外側ループ)と、5回の繰り返し(内側ループ)を4回繰り返す(外側ループ)も、背後にある状況(繰り返し処理の構造と挙動)は違います -- 異論はないです。
で、そのような背後にある状況の違いを、表記上も違う書き方をすると約束して守らせたいの? そこが分からん! …… (しばらく自分で考えてみた) 背後にある状況の違いを認識しているかどうかを確認するために、ローカル・ルールを設ける、って話かな? 必要なのかぁ、そんなこと。
それと、掛け算ばっかりやり玉に挙げるけど、足し算は放置でいいの? 指を折る“数え足し”を考えると、4 + 5 と 5 + 4 は違います。
- 最初に指を4本折る、次に指を5本折る。
- 最初に指を5本折る、次に指を4本折る。
この2つは、違った処理過程(手順の遂行過程)になります。足し算の順序も「徹底するようにして下さい」ってならないの?
*1:もっと正直に言うと; おまえ何考えてんだよ!? どうかしてんだろ。