オムライス

普段はきっこのブログは読んでないんだけど、subscribe しているサイトからリンクがあったので。
本題とはまったく関係ないんだけど。

オムライスはどこの国だか知らないけど、とりあえず洋食だし、あたしが例にあげた中だと、ニポンの食べ物は炊き込みご飯だけか。

オムライスって日本発祥の料理じゃなかったっけ?オムレツ+チキンライスでオムライスってネーミング自体、もう日本以外では有り得なさげ。
で、Wikipedia で調べてみたら、やっぱり日本独自の料理だった。

オムライスは、日本独自のご飯料理のひとつで、オムライスという言葉自体も和製語である。いわゆる洋食の代表格。日本式にケチャップで味付けしたチキンライス(またはバターライス)を卵焼きで包んだもの。

もうひとつ。

ニポンでは、この5年間で、生活苦による自殺者が10万人以上も出てるのに、よその国にはお金や食料をバラ撒いてるなんて、政治家って国民の代表のハズなのに、国民のことよりもソトヅラのほうが大事なんだろうか?

ふむ。平成17年中における自殺の統計によると、経済生活問題による自殺は年間3,000人そこそこですが。遺書無しが年間2万人強いるけど、「この5年間で、生活苦による自殺者が10万人以上も出てる」ってのはいささか誇張が過ぎやしないか。
まぁ、きっこだしな。仕方ないか。

条、項、号

またまた、本題とはまったく関係ないんだけど。

第二条 子は、次の場合には、日本国民とする。
    一 出生の時に父又は母が日本国民であるとき。
    二 出生前に死亡した父が死亡の時に日本国民であつたとき。
    三 日本で生まれた場合において、父母がともに知れないとき、又は国籍を
     有しないとき。
    (準正による国籍の取得)

仮に属人主義をよしとしたところで、父母の待遇に差がある第二項はおかしい。

ええと、条文の読み方をご存知でないのだろうか*1。それは「第二項」ではなく、「第二号」だ。
ちなみに法律の条文において、漢数字だったり、算用数字だったりするのはきちんと意味があって、この場合は漢数字が「号」で、算用数字が「項」をあらわす*2。あと、通常は第一項の数字は省略されるので、条の中で突然「2」と出てきたらそれより前が第一項だったりする。

*1:いや、ほとんどの人は知らないだろうけど

*2:出版物ごとに違う場合もあるらしい

NULL と 0

なぜだか最近 C++ ネタが多いな。研究では JavaPython か Shell Script がほとんどなんだけど。

ここでは、NULLは((void*)0)であって、0ではないのだから、場合によっては動作が違うよ……ということが書かれています。
でも面白いことに、C++ではNULLと0は完全に同じです。

#define NULL 0

とされています。
そもそも、もしもNULLの型がvoid*だったのなら、C++では、char*に対してそのままの代入が行えません。
なのでC++では、NULLと0は完全に同じものです。(UNIXだと、違うとでも言うのでしょうか?)

ええと、C++ では NULL と 0 が同一なんて規定があったっけ? NULL マクロを使うのをやめてリテラルの 0 を使えという話はありがちだけど、とりあえず GCC-4.0 では NULL と 0 が同一なわけではない。以下 64bit 環境での結果。

% cat test.cpp
#include <cstddef>
#include <iostream>

int main()
{
    std::cout << "NULL: " << sizeof(NULL) << std::endl
        << "0: " << sizeof(0) << std::endl
        << "0L: " << sizeof(0L) << std::endl;
    return NULL;
}

% g++ -E test.cpp | tail -n 8
int main()
{
    std::cout << "NULL: " << sizeof(__null) << std::endl
        << "0: " << sizeof(0) << std::endl
        << "0L: " << sizeof(0L) << std::endl;
        
    return __null;
}

% g++ -Wall test.cpp
test.cpp: In function `int main()':
test.cpp:9: warning: converting to non-pointer type `int' from NULL

% ./a.out
NULL: 8
0: 4
0L: 8

現象まとめ。

  • NULL は 0 に展開されるわけではなくて、__null に展開されている
  • int であるべきところに NULL って書いたらきっちり「NULLから非ポインタへの変換」と警告が出る
  • 実際に 64bit 環境では 0 と NULL のサイズは異なる

まぁ、常に 「#define NULL 0」だと思っていたら大間違いだということです。