アカウント名:
パスワード:
void die(e,s) int e; char *s; { substdio_putsflush(subfderr,s); _exit(e); }
void straynewline() { out("451 See http://pobox.com/~djb/docs/smtplf.html.\r\n"); flush(); _exit(1); }
if (databytes) if (!bytestooverflow) { out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n"); return; }
順もさることながら、不要になった時点で評価を止めてしまうというのも大事です。 たとえば if (x1 && y) で x1 が偽の場合、if (x2 || y) で x2 が真の場合などでは、y は評価されません。
こういう仕様最近ではあたりまえですが、C言語以前では、最後まで必ず評価されてしまうものや評価されるされないが実装でバラバラなので「されてしまう」ことを前提にコーディングしなきゃいけないもの、なんてのがゴロゴロしていました。なので、この部分を明確にしていた Cという言語は私には画期的に思えたものです。
難読プログラムコンテストにでも出す気なのか?
DJB は IOCCC Winner [ioccc.org] です。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
最初のバージョンは常に打ち捨てられる。
qmailのソースが (スコア:3, おもしろおかしい)
ちらっと見てみたら確かにすごい!!
適当に開いてみたtcpto.cの96行目当たりから
lastwhen = (unsigned long) (unsigned char) record[11];
lastwhen = (lastwhen lastwhen = (lastwhen lastwhen = (lastwhen when = now();
プログラミング初心者の私がいうのも何なんですが
その他の例 (スコア:3, 参考になる)
例えば、qsmhook.cの
とか。なんでこんなにしてまで1行にしなきゃいけないんだろう。
難読プログラムコンテストにでも出す気なのか?
これ(qmail-smtpd.c)なんて
読みにくいのもそうだけどサイトのURLが変わったらどうすんのよ。
それだけでバージョンアップ?
他に気になる点は
databytes関連で、こんな個所もありました。
複数のif文まで1行ですか。はあ。
--------------------
/* SHADOWFIRE */
英語が母国語の人は (スコア:2, 参考になる)
日本人から見ると、構造化もへったくれもないただの汚いコードにしか見えない、ということなんだよ。
だから、このコードを英語があまりうまくない日本人が書いたとしたら、批判は当たりと思うよ。
Re:英語が母国語の人は (スコア:0)
ヨタ話とか思えないけど、もし本気で言っているのなら、論理記述言語と
自然言語についてもうちょっと勉強したほうがいいと思うよ。
COBOLって好きさ! (スコア:0)
Re:COBOLって好きさ! (スコア:0)
ヤシがいる場所だよ、ここ。
Re:その他の例 (スコア:2, 興味深い)
if( x ) if ( y ) { ... }
って if( x && y ) { ... }
と同じじゃないんでしょうか(マクロで書くなら気をつけなきゃいけませんが)。
スタンダードではないですがある意味深いカッコがへっていいような気もするので、少なくとも「スタンダードでないからダメ」以外の理由でそんなに理に叶っていないとか特別に読みにくいコードには見えないです。
# でも僕は決してif( x ) if( y ) なんて書きませんよ
脆弱性発見とかいうトピックで、こんなにソースを見ている人がいるのかと思ってびっくりです。
---
飲酒済みにつき乱筆御容赦。
Re:その他の例 (スコア:1)
Re:その他の例 (スコア:0)
> って if( x && y ) { ... }
> と同じじゃないんでしょうか(マクロで書くなら気をつけなきゃいけませんが)。
上のコードではxの評価が必ずyの評価よりも先になります。下の場合はどちらの評価が先になるか分かりません。
Re:その他の例 (スコア:0)
if (p && p->x) { ... }
と書けないことになるじゃないですか。
Re:その他の例 (スコア:1)
>と書けないことになるじゃないですか。
C言語の場合,
結合規則(?)で「 x && y && z は, ( x && y ) && z と評価する.」とはあるけど,
「 && は,左オペランドを先に評価する.」と決まってました?
# if( x ) if( y ) { ... }
# と書けば,必ず x が先に評価されてから y が評価されるので,
# 評価の順番が明確になります.
Re:その他の例 (スコア:0)
> C言語の場合,
>結合規則(?)で「 x && y && z は, ( x && y ) && z と評価する.」とはあるけど,
>「 && は,左オペランドを先に評価する.」と決まってました?
決まっている [catnet.ne.jp]らしいですね。
まあ、私的には書き方なんてどうでもいいと思いますが。
Re:その他の例 (スコア:0)
Re:その他の例 (スコア:1)
&& || ,(カンマ) と ?:(3項演算子) は,特例か...気をつけないと.
Re:その他の例 (スコア:1)
順もさることながら、不要になった時点で評価を止めてしまうというのも大事です。 たとえば if (x1 && y) で x1 が偽の場合、if (x2 || y) で x2 が真の場合などでは、y は評価されません。
こういう仕様最近ではあたりまえですが、C言語以前では、最後まで必ず評価されてしまうものや評価されるされないが実装でバラバラなので「されてしまう」ことを前提にコーディングしなきゃいけないもの、なんてのがゴロゴロしていました。なので、この部分を明確にしていた Cという言語は私には画期的に思えたものです。
Re:その他の例 (スコア:0)
そのためのpobox.comなんじゃなくて?
# まあ、pobox.com自体が消滅する、という可能性もないわけではないが。
Re:その他の例 (スコア:0)
Makefileに書くなり、djb的文法でもconf-hogehogeっていうのも
あるのに。
難読プログラムコンテスト (スコア:0, 参考になる)
DJB は IOCCC Winner [ioccc.org] です。