ポインタの迷路と、それを読むコンパイラ

ところでこんなのをCで書いた

puts("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"+'!');

なんか変。でもこんな風に文字列をつなげられるやつもあるよね。C#もいけると思う。
動かしてみるとXYZしか表示されない。これいかにと。
まぁCでは文字列はchar型の配列だということが重要だな。
普通putsにはchar型の配列、すなわち1文字目のポインタを渡してあげるはず。
だから結局このプログラムでは

char str[37]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
puts(str+'!');

と書いてみる。おかしいわな。
strはchar*型、char型のポインタなわけだ、’!’みたいにSingle Quotationで囲めば数値になる。
‘!’というのは0x21、すなわちは33と書いているのと同じ。
だからポインタと数字の足し算をしてたんだな。
だからstr[33]、すなわちXの字のポインタを渡してたみたい。
そこが1文字目として、最後まで、確かにXYZ。
まぁポインタ知らんと痛い目にあうぞということだ。
だから

printf("Hello,world!);

って実は結構複雑だということだよ。恐るべしHello,world!
一番簡単で目に見えることは1文字表示することだろうなぁ。これは至極簡単。
さて、有名なCコンパイラを3つそろえました。
・GNU C Compiler (Cygwin上) [gcc] (GNU)
・Borland C++Compiler [bcc32] (Borland)
・Visual C++ .NET Expressのコンパイラ [cl] (Microsoft)
とりあえず、この3つありますけどねぇ…
まぁ一番おすすめはBCCですね。Windowsではポピュラーだし高性能だし。
それに天下のBorlandのだし。
で、Cygwin上はLinuxとかに似た状態なんで、ソースをそのままUNIX系OSに持っていってもほとんどつかえる。
まぁ、確かにCのソースはそもそも互換性高いけど、システムコールとか違うらしい。
あんまりそんな機会に遭遇したことないけどそれが事実。
楽しいというのとgccという響きがいいのではじめに導入したのがgccだったんだがね。
Microsoft製のclはWindowsで極端な性能を出すそうだけど…本当か?
なんか遅いんだけど…
いや、実は、5+5をして、8進数・10進数・16進数で表示することを1000000回繰り返すテストをしたんですよ。
ちなみに、NULにリダイレクトしてますよ。
するとGCCでしたのが3秒、BCCでしたのが4秒、これは互角だね。
ところがMicrosoftのCLでしたのは19secもしたんだけど…なんで?
というわけで、WindowsネイティブならBCC、UNIXとの互換性のためにはCygwinでGCCってとこかな?
まぁMicrosoftのCLにしかできないのは.NET Frameworkでフォームとかを作れるということだけど。
でも、まぁ、あんまり使わんでしょうねぇ…
というわけでもう少しBCCを磨きたいなと。コンパイルオプションがわかりにくくて。
たとえばtest.cをtest-bcc.exeに仕立て上げるとき

> bcc32 -e"test-bcc.exe" test.c

とまぁ…なんでこんな変な書き方…ちなみにGCCは

# gcc -o test-gcc test.c

って具合。こっちは素直なんだけどね。