http://unkode-mania.net/view/5055e449a753b5d160000008
代入演算子と、比較演算子の取り違えはよくありますが、テストすりゃ判る。それはその通り。
式の中で、代入と比較を混在できるのも、よくよく考えればヤバイ。とは言え、これは手続き型言語の鬼門とも言えますな。本来は言語仕様レベルでなんとかするべきでしょう。この点考慮してるのは、pascal系ぐらい?しかも流行ってません。この間違えた誰かさんはpascal育ちなのでは無いでしょうか?そんなに馬鹿にしたものではないかもよ。
そもそも字面が1文字違いってのもヤバいです。イコール1個忘れたら動かないわけですよ?むしろ間違えるなって方が無理。よくよく見ても判りません。小生、乱視が酷くてですね。
そういう意味では、Java族のgetter/setterはその反省といえるのかも知れませんが、1文字違いなのは解決してないという。
クラス初期化にmemset
http://unkode-mania.net/view/5019208444f2527722000000
Cまではメモリ管理がプログラマ任せでしたから、その調子でC++を書けば、こんなことは起こるでしょう。intで宣言したら0入れて、char[]で宣言したらmemsetで、ってそんな馬鹿正直に書くより、全部memsetしちゃったほうが賢い。悪いのは仮想関数の機構、および、初期化しませんっていう、C/C++ランタイムのサボリです。
forの2段目のコピペ間違え
http://unkode-mania.net/view/50177f11fc12b2e54a000000
これは古典的Cのfor構文が悪い。ネタでは2段ループの2段目を間違えました。ってオチですが、実はこれ。1段でも起こります。
古典for構文では、制御変数を3回書かなければならない。故に、後発の軽量言語では大抵foreachが使えます。極力ソレを使うべき。なにより、「ループの意図」を明確にできます。
逆に、古典forの3ブロックの式で、すべて別の変数をイジることはできるわけですが、むしろ小生としてはそっちの方が有用だと思ってます。
- ループの前に必ずやること、
- ループの終了条件、
- ループの最後に必ずやること、
という3点を明記できますから。
初期化ブロックとかを空にして無限ループとかいう小細工も横行してますが、小生の感覚では、これは裏技です。コンパイラを騙してる感がします。