PG_kura 2012-08-17 03:04:39

[C] NULL と 8 の何故 このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

テストは通ってるけど、教科書からやり直しですねぇ。

#define TO_STRING(n, str) \
  if(n != NULL) { \
    sprintf(str, "%d", n); \
  } else { \
    char s = n; \
    sprintf(str, "%s", &s); \
  }
  // ↑NULL は何故かこうしないと正しく "" になってくれない!
 
#define TEST(n, result) \
  { \
    char buffer[100]; \
  \
    TO_STRING(n, buffer); \
    assert(strcmp(buffer, result) == 0); \
  }
 
int test()
{
  TEST(-52, "-52");
  TEST(-11, "-11");
  TEST(-07,  "-7");
  TEST( 03,   "3");
  TEST( 05,   "5");
  TEST(  8,   "8");  // 8 は何故か 08 って書くとエラー!
  TEST( 20,  "20");
  TEST( 34,  "34");
  TEST(NULL, "");
 
  // 全てのテストが通ったことを確認。 12/08/16
}

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(16)

#1 HarpoonArrow 2012-08-16 15:17:17  

「8は何故か~」ツボったwwww

#2 math_neko 2012-08-16 15:26:14  

> 8 は何故か 08 って書くとエラー 何でだろうねー(棒)

#3 customX_156 2012-08-16 18:38:46  

TEST( 0, "0"); はやらなくて大丈夫なのかなー

#4 calc3 2012-08-17 18:22:09  

int i=0; TEST(i++, "0"); TEST(i++, "1"); //←なぜか2つめで失敗する

#5 ItSANgo 2012-08-19 04:30:28  

マクロの濫用も気に入らないなぁ。

#6 shidocchi 2012-08-19 14:05:20  

TO_STRINGマクロのテストコード? こんなの他で使いたくないが...

#8 bpeppy 2012-08-20 02:52:56  

直書き以外で、NULLやら、08やらを受け取る場面とは…

#9 DigitalMisaka 2012-08-21 23:23:55  

うーん・・・ C++ならNULLは0だから・・・いやダメだろ!

#10 kobae964 2012-08-22 00:31:46  

マクロで複数の文を記述するときには do{statement...;}while(0) とすべきではないのか

#11 Fantom_JAC 2012-09-04 18:49:12  

うーん、香ばしい。

#12 tomorum 2012-09-13 13:18:45  

0から始まる数字は8進数として解釈されるのか。8進数とか使わないから初めて知ったわぁ。 まず、TO_STRINGの第一引数にNULLを指定すると、第2引数が""になるって仕様が違和感ありまくり。 それを是としても、line5,6はないわ…

#13 3higo3 2013-02-20 01:10:10  

cでありながら値をScriptみたいな扱い方しようと思いつく不思議

#14 S_F__ 2013-12-22 11:49:15  

これを見るといつか10を書くつもりで010とか書いて自爆するんじゃないかと思ってしまう

#15 EH500_Kintarou 2014-06-06 00:59:02  

if(hoge == foo)   TO_STRING(10, str); else   TO_STRING(20, str); とか書いたときにエラーが出て悩むパティーン

#16 utubyou009 2017-07-24 15:26:23  

突っ込みどころ満載だけど、取り敢えず、マクロ使うなら(n) とか (str) とか括弧を付けましょう。 あと、NULLが0に展開されるのはC++で、もしかしてVisual Studio のVC++でソースファイル名の拡張子を省略した?C++としてコンパイルされるよ。拡張子「c」を明記すればNULL は((void*)0) に展開されるので純粋なC言語プログラムを書きたいときによい。

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[Java] is禁止令

このエントリーをはてなブックマークに追加

ウンコードの趣旨とは違い、レビューで指摘...

// Mod yamada Start

// 一般的に考えて真偽値を返すメ...

鑑賞する »

[C] すげーちゃんと動く!

このエントリーをはてなブックマークに追加

結合試験2日前に脱退したうんkプログラマ...

return 0;

鑑賞する »

[Java] 連番

このエントリーをはてなブックマークに追加

もはや人間が読むものではない。

...

package com.renban.erq053.czp008;

/**...

鑑賞する »