トップ «前の日記(2003-11-17) 最新 次の日記(2003-11-19)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|

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;

_ 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 退勤。

本日のツッコミ(全3件) [ツッコミを入れる]
_ のぶ (2003-11-18 12:34)

処理系によっては「全て評価してから論理計算」という場合もあるので、そのときは必ず死ぬかと(笑)

_ さいき (2003-11-18 22:17)

まぁ〜Microsoftだしとか言って見る。

_ のぶ (2003-11-20 19:32)

例えば Delphi だと、コンパイラ指令によって全て評価するようにできるでしね。