分かりにくいコードなのかイディオムなのか

次の2つのコード、どっちが分かりやすいですか?


その1

void strcpy(char *dest, char *src)
{
    while (*dest++ = *src++);
}


その2

void strcpy(char *dest, char *src)
{
    while (1) {
        *dest = *src;

        if (*dest == '\0')
            return

        ++dest;
        ++src;
    }
}



K&Rでは

これ(その1)は一見してわかりにくいように見えるが、この記法はかなり便利なものであり、Cプログラムでよく見かけるという理由から、こうした慣用法はマスターすべきである。



この本では

時には、優れたプログラマでも、この(その1)ようなコードを記述してしまいます。しかし、(その2)のように多少冗長なくらいにする方がプログラムは理解しやすいものになるのです。


自分はまあどっちでもいいんじゃないのって思います。
自分が書きそうなのはその2だとは思うんだけどその1が悪いとも思わないんだよね。
だって、その1ってもうイディオムってくらい有名だしさ。
イディオムじゃないとしてもstrcpyって書いてあるから、文字列のコピー関数だってのは一発でわかる。
中身もポインタをインクリメントしてってヌルになって式の値0になってループ終了で、あ、ほんとに文字列コピーされてる。あったまいい。って、わかるよねえ。


いや、できるだけわかりやすいコードを書くことは良いことだと思うからその2のほうが良いとは思うんだ。
仕事で書くにしてもその2だよね。いちいちポインタに萌えててもしょうがないし。


でも、わかりやすいコードわかりやすいコードって言って、その1をなんだこのわかりにくいコードは!最悪だ!って言うのはどうかなあ。
そんな人がいたらそりゃああんたの頭が悪いと言ってあげたい。