「!strcmp」

リンク元をみたら「!strcmp」というクエリでここにたどり着いた方がいました。残念ながらその方の期待には応えられなかったのですが、「!strcmp」については一言言っておこうかなと。strcmp() は 3 つの状態を表す結果を返すので、プレディケイトではないのに、真偽値に対して使うことが想定されている論理否定演算子を使うのは意味的にどうなのよ。と。

CodeSearch したら約337,000件あった。

似たような問題で

void *ptr = ...;

if (ptr) { /* (1) */
  do_some();
}

if (ptr != 0) { /* (2) */
  do_some();
}

if (ptr != NULL) { /* (3) */
  do_some();
}

どれがお好みでしょうか。

「<% %>」をCで使う

C99のCommittee Draft(N1124)を読んでいて、また目から鱗。以下のスクリプトがコンパイルできるという話。

#include <stdio.h>
main()
{
    <% puts("Hello world!"); %>
}

なんと、JSPスクリプトが記述できる…のではなく、これは次の仕様によるものでした。P64、PDF 上の P75に該当箇所があります。

In all aspects of the language, the six tokens


<: :> <% %> %: %:%:

behave,respectively,the same as the six tokens

[ ] { } # ##

except for their spelling.

C89ではどうなのかと思って -std=c89 でコンパイルしてみたらちゃんと文法エラーになりました。