daily memorandum 2.3.0
CBUG | FreeBSD | Hiki | Knoppix | Mac | Ruby | W-ZERO3 | Windows | ad | amd64 | ks | linux | momonga | net | print | security | tdiary | unix | www | 会社 | 鯖缶 | 全学ゼミ | 本
2007-12-01 (Sat)
_ C で bool型
ISO C++ とか C99 とかの規格が固まって処理系の実装が進んでいる頃(GCC 3.2 の頃)に 開発から足を洗ってしまったせいで、すっかりその辺の事情に疎くなってるらしい… 最近の C って bool型(より正確には _Bool型)とか true/false 使えるのね。
_Bool型と bool/true/false
組み込みの _Bool型が定義され、 stdbool.h では bool/true/false というマクロが(C++との互換性のため?)定義されてます。
ISO/IEC 9899:TC2 によると、
- マクロ bool は _Bool に展開されるべし。
- マクロ true は整数定数値 1 に展開されるべし。
- マクロ false は整数定数値 0 に展開されるべし。
だそうで、実際 FreeBSD 6.2 の /usr/include/stdbool.h では
#define false 0 #define true 1 #define bool _Bool
なんて定義されてます。
最初にこの実装の方を見てしまったので、 「これって implemetation dependent だったりしないよね?」と ちょっと心配になったのだけど、 規格にちゃんと書いてあるので「true が 1 で false が 0」というのは 安心して使って良さそう。
_Bool 型の変数に 0, 1 以外を代入すると?
When anyscalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.
とあるので、bool (_Bool) 型の変数に 0, 1 以外の値を代入しても 強制的に 0 or 1 にされてしまいます。
#include <stdio.h>
int main() {
_Bool a = 1;
_Bool b = 2;
printf("a=%d, b=%d\n", a, b);
return 0;
}
% gcc bool.c
% ./a.out
a=1, b=1
つーことで、enum 使って bool の emurate するよりマトモに使えそう。
#include <stdio.h>
typedef enum {true = 1, false = 0} bool;
int main() {
bool hoge = 2;
printf("%d\n", hoge);
return 0;
}
% gcc enum.c
% ./a.out
2
参考
_ ISO C99 の規格
ISO JTC1/SC22/WG14 のページからダウンロード出来る なんて、実は今日の今日まで知らなかったりして…orz
ISO C++ は相変わらず ANSI から買う 以外ないみたいだけど。しかも、今 ANSI のサイト見たら、$30 に値上げされてるし… (C++ FAQには $18 とあるのに…)。
- http://press.eek.jp/result/iso/iso ダウンロード ×50
- http://press.eek.jp/result/iso/iso dvd ×8
- http://2ch.free4seo.com/reserve/word/0/凸 画像 ×7
- http://bloger.x0.com/result/iso/iso dvd ×4
- http://blogranking.net/outgoing.php?b=974&u=http:/... ×4
- http://press.eek.jp/result/ipod touch/ipod touch ダ... ×4
- http://press.eek.jp/result/iso/iso 再生 ×3
- http://bloger.x0.com/log/result/iso/iso Linux ×3
- http://reader.livedoor.com/reader/ ×3
- http://search.live.com/results.aspx?q=false&mrt=en... ×2
- http://m.blogranking.net/outgoing.php?b=974&u=http... ×2
- http://www.sfa-cms.org/word/wmv/wmv dav ×2
- http://press.eek.jp/result/ipod touch/2ch ipod tou... ×1
- http://press.eek.jp/result/ipod touch/ipod touch 新... ×1
- http://209.85.175.104/search?q=cache:OcKYNW-qpm4J:... ×1
- http://bloger.x0.com/result/download/download Knop... ×1
- http://bloger.x0.com/result/iso Linux/iso Linux ×1
- http://www.weblog-search.com/ws/weblog_search.php ×1
- http://2ch.free4seo.com/reserve/word/ ×1
- http://bloger.x0.com/result/iso/iso Linux ×1
- http://search.live.com/results.aspx?q=false&form=Q... ×1
- http://blog.with2.net/new_item.php ×1
- wmv.DAV 解除 ×18 / wmv.DAV ×12 / DAVファイル wmv ×6 / wmv.dav 解除 ×5 / DAVファイル 解除 ×5 / DAV解除 ×4 / .wmv.DAV ×4 / ANSI C99 ダウンロード ×3 / DAVファイル 解除ソフト ×3 / DAV 解除 ×3 / dav 解除 ×3 / DAV 解除 wmv ×2 / dav ファイル ×2 / bool型 enum ×2 / DAV ファイル 解除 ×2 / wmv.davの解除 ×2 / DAVファイル ×2 / wmv.dav 編集 ×2 / キーワード不明 ×2 / wmv.dav解除 ×2 / dav ファイル 解除 wmv ×2 / c _Bool 型 ×1 / stdbool.h C++ ×1 / unix stdbool ×1 / C++ stdbool.h ×1 / c99 bool true false ×1 / wmv.dav 解除 ×1 / 凸め ダウンロード ×1 / 凸め ×1 / 喘ぎ声 ダウンロード mp3 ×1 / 喘ぎ声 mp3 ダウンロード ×1 / DAVファイル 再生 ×1 / wmv.dav ×1 / 認証 解除 WMV ×1 / wmv dav ×1 / bool C ×1 / DAVファイル 再生 ×1 / c99 新機能 ×1 / wmv ファイル DAVファイル ×1 / DAVファイル 解除 ×1 / 凸画像 あけおめ ×1 / DAV 認証 解除 ×1 / アンインストールmp3 ×1 / wmv DAV 解除 ×1 / wmv dav 解除 ×1 / wmv.DAVファイル ×1 / BOOL FALSE 1以外 ×1 / アンインストール mp3 download ×1 / DAVファイル ×1 / .wmv.dav ×1 / portupgrade-2.4.3 ×1 / DAVファイルの解除 ×1 / ISO C++ ×1 / c99 規格書 ansi ×1 / dav ファイル 解除 ×1 / WMV DAVファイル ×1 / C++ 規格書 download ×1 / wmv ×1 / dav wmv 解除 ×1 / enum bool true false linux ×1 / アンインストールMP3 ×1 / あけおめ 画像 凸め ×1

JTC1/SC22/WG14のページからダウンロードできるものは、厳密に言えば「規格書」ではなくて、「規格書と同一内容のWG14部内レビュー用文書」です。いや、我々からするとどっちでもいいんですが。
kumaさん、コメントありがとうございます。今ごろ気付きました(苦笑)。
厳密な意味での「規格書」が欲しければ、ちゃんと買えってことなんですかね。
まぁ、内容に相違がなければどっちでもいいんですけど。;)