int型

gccでは通常、型名を省略すると自動的にint型になります。いちいち型名を書くのはめんどくさいので、できるだけint型を使いましょう。
基本
ローカル変数を用いる場合は「int」を書かなければなりませんが、グローバル変数で宣言すると「int」は不要になります。グローバル変数は0で初期化されます。
また、mainの第一引数で変数を宣言するとセミコロンが不要になりさらに1バイト短縮できます。この場合、通常は1が初期値となります。
a,b;main(i){...}
というプログラムを書いた場合、変数aとbの初期値は0、変数iの初期値は1となるわけです。簡単ですね。

また、グローバル変数で宣言した場合、初期値を与えてやることができます。
a=5;main(){...}

たいていの場合、変数を一つはmainの第一引数に書いた方が短くなるので、「初期値0を使いたいんだけど……」という場合もできるだけ工夫してmainの引数で宣言するようにしましょう。
応用
さて、mainの第一引数には上述の通り1が入りますが、第二引数以降には何が入るでしょうか? 実は、コマンドライン引数や環境変数などへのポインタが入ります。言葉で言うと難しそうですが、言ってしまえばどっかのアドレスです。中に何が入っているかは大した問題ではありません。
アドレスには違いないので、gets()の引数に渡すなどして読み書き可能です。このことはGolfにおいては重要です。
main(i,s){gets(s);...}
ということができるわけです。ここで、あくまでsの型はintであることに注意してください。gets()の引数はchar*となっていますが、int型を渡せば自動でchar*と解釈してくれます。警告が出ますが動けば問題ありません。

配列の宣言の仕方も書いておきます。基本的にはグローバル変数で、
a[99];
などと書いてあげれば配列を作ることができます。簡単ですね。

特筆すべきこととして、要素数を省略して
a[];
とすると、これは要素数1の配列と解釈されます。アクセスする範囲が狭ければ、要素数1で宣言してメモリ破壊を犯しても動く場合があります。配列を使う機会があれば試してみても良いでしょう。

char型

Golfにおいて、int型の次に使う機会が多いのがchar型です。char型の変数をひとつだけ使用するということはまずなく、ほとんどchar型配列か、char*型として使用することになります。

char型配列を使用する場合の基本は、int型と同じく
char s[99];
となります。要素数が1の場合は省略可能です。
(余談ですが、「char」を省略してs[99];とした場合、上述の通りこれはint型の配列として扱われます。そのため、gets()で読み込んだあとs[0]で最初の文字にアクセスするなどということはできません。あくまでint型配列なので、4バイトずつまとめて整数として扱われるからです。)

char*を利用する場合も同様に、
char*p;
などとします。「char」と「*」の間、あるいは「*」と「p」の間にスペースは要りません。

char*型については、際立ったテクニックがいくつか存在します。まず、mainの第二引数をchar*型として扱いたいことはよくありますが、その場合に
main(i,s)char*s;{...}
と書くことができます。遥か昔のCの関数定義の方法ですね。
main(i,char*s){...}
でいいんじゃないか? と思う方がいると思いますが、gccでは関数のカッコ内では、引数の型は「全部省略してint」か「全部ちゃんと書く」のいずれかである必要があるので、この記法だとiの型名がないというエラーが出ます。全部書かなければOKなのに、一部の型名をちゃんと書いたらエラーというのはよくわかりませんね。まあともかく、この仕様のおかげで最初の書き方が最短となっています。今のうちに慣れておきましょう。

次に、これはchar*型に限りませんが、例えばchar*型の変数sがあったとして、
s[0]
と書く代わりに
*s
と書くことができます。sが配列だったりすると意外と盲点です。カッコを書くと長いのでできるだけ後者で済むように工夫しましょう。

最後に、「char*p;」はちゃんと型名がついているので、int型と違ってローカル変数として使用可能です。例えば、
main(i,s){char*p=s;...}
のようなことができるわけです。これは案外見落としがちなので注意しましょう。

float型

最後に浮動小数点型であるfloatについてちょろっと解説しておきます。ちなみに、倍精度浮動小数点型のdoubleはfloatより1バイト長いというだけで完全にレアキャラと化しています。見かけたらラッキーです。

基本的には、普通に
float x;
などとしてやるだけです。ちなみに、これもグローバル・ローカルともに使用できます。初期値は0になります。

注意点としては、int型同士で演算を行うと演算結果もint型として行われます。ですので、例えば5/2が2になったりします。これでは困る場合は、
x=1.*a/b
など、計算結果をdouble型にしてしまいましょう。xに代入されるときには自動でfloatに丸められるので問題ありません。なお、「1.」は「1.0」のことで、0は省略可能です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます