2003-11-18
_ R.O.D
read or die って。動作未確認。普通は open() のように処理するよな。
#include <fcntl.h> #define die() exit(1) int main( int ac, char** av ) { int fd; char buf[ 1024 ]; if( ( fd = open( "./test", O_CREAT ) ) < 0 ) { perror( "open" ); die(); } ( read( fd, buf, sizeof( buf ) ) < 0 ) || die(); // ← R.O.D close( fd ); return 0; }
_ 買物
- Software Design
- UNIX MAGAZINE
- Software People(3)
_ R.O.D(2)
げ。論理が違った。上のやつだと die() を通ってしまう。
--- rod.c.src Tue Nov 18 13:19:56 2003 +++ rod.c Tue Nov 18 13:21:14 2003 @@ -10,7 +10,7 @@ die(); } - ( read( fd, buf, sizeof( buf ) ) < 0 ) || die(); // ← R.O.D + ( read( fd, buf, sizeof( buf ) ) != -1 ) || die(); close( fd ); return 0;
_ Microsoft Excel ショートカット早見表
壁紙かよ。
_ R.O.D(3)
ぃゃ それ は Microsoft に失礼なのだよ。ひとまず Visual C++ 6.0 と gcc 3.0.4 では期待どーりに動作した。
さて、手元の C デスクトップリファレンスには以下のように書いてある。
演算子 && と || は、左のオペランドを最初に評価します。 左のオペランドの値から、すでに演算結果が判明 (つまり、&& の左のオペランドが 0 であったり、|| の左のオペランドが 0 でなかったり ) していれば、右のオペランドは評価されません。
例 i < max && scanf("%d", &x) == 1
この論理式では、i が max より小さいときにだけ、 関数 scanf() を呼び出します。
C デスクトップリファレンス は ANSI 規格 X3.159 に基づいているそうな( いわゆる ANSI C99 の前の版。ANSI C99 については プログラミング言語 C の新機能 参照。実際の ANSI C 規格を参照したいところなのだけど有料なのでちと入手する気にならない )。
さて、上記のとーり Visual C++ と gcc は C の規格を満たしていると思われる。
では 全て評価してから論理計算している処理系 がどんなのか気になる気になるなん略。
_ ぅぅむ
明日は赤坂集合か。
_ 仕事
0100 退勤。
処理系によっては「全て評価してから論理計算」という場合もあるので、そのときは必ず死ぬかと(笑)
まぁ〜Microsoftだしとか言って見る。
例えば Delphi だと、コンパイラ指令によって全て評価するようにできるでしね。