Re: こんなコード書く?
いいじまです。
> > return ((n<1||n>12)?name[0]:name[n]);
> >
> > 私なら通常はif文で書きますけど(例外:式しか書けない場所)、
> > 皆さんはこういうコードは書きます?
>
> 書きません。なぜなら
> - return に () は付けない。
> - 12 というマジックナンバーを埋め込んだりしない。
あはは。書き忘れていましたけど、name[] は
char *name[13] = {"", "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
のように初期化されています。だから12でいいんです。
> - 例外は後ろに持ってくのが趣味なので
> (n < 1 || n > 12) ではなく (n >= 1 && n <= 12) と書く。
> - てゆーか <= は嫌いなので (n >= 1 && n < 13) と書く。
私が三項演算の形で書くとしたら (1<=n && n<=12) ですね。
数学の 1≦n≦12 という表記と同じ順序になるように並べます。
> - 演算子の前後は空白いれる。
私なら上記のように、意味的に最小単位のまとまりになっている(=演算の優先
順位が高い)部分は空白なしで詰めて、それ以外は適宜空白なり改行なり、です。
ip = a.x*b.x + a.y*b.y + a.z*b.z; とかね。
#演算子オーバーロードで ip = a*b; と書いてしまうのもひとつの方法。
> r1 = p1ok ? PPM_GETR(pixels[y1][x1]) : 0;
> g1 = p1ok ? PPM_GETG(pixels[y1][x1]) : 0;
> b1 = p1ok ? PPM_GETB(pixels[y1][x1]) : 0;
これは私なら、行数が長くなっても
if (p1ok)
{
r1 = PPM_GETR(pixels[y1][x1]);
g1 = PPM_GETG(pixels[y1][x1]);
b1 = PPM_GETB(pixels[y1][x1]);
}
else
r1 = g1 = b1 = 0;
ですね。ただ、1と言うことは2も3もあるわけで、そういう場合は
#define SET(r,g,b,x,y) do { \
(r) = PPM_GETR(pixels[y][x]); \
(g) = PPM_GETG(pixels[y][x]); \
(b) = PPM_GETB(pixels[y][x]); \
} while (0)
とか、もう少しエレガントに
inline void SET(byte &r, byte &g, byte &b, int x, int y)
{
r = PPM_GETR(pixels[y][x]);
g = PPM_GETG(pixels[y][x]);
b = PPM_GETB(pixels[y][x]);
}
とかしてから
if (p1ok) SET(r1,g1,b1,x1,y1); else r1=g1=b1=0;
if (p2ok) SET(r2,g2,b2,x2,y2); else r2=g2=b2=0;
if (p3ok) SET(r3,g3,b3,x3,y3); else r3=g3=b3=0;
ですね。
> printf の引数とか。
これはよく使います。
> 逆に f(g()) みたいなのはネストせず x = g(); f(x) と書きます。
> これはデバッガを使ったとき、操作が楽だからです。
ソースレベルデバッガ使ったことない…
#一度だけ、他人の書いた長いコードがぬるぽで落ちるので gdb に食わせたら
#一発解決、っていうケースがありましたけど。
========================================================================
飯嶋 浩光 / でるもんた・いいじま http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delmonta@ht.sakura.ne.jp
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735