とりあえず書いてみよう

早速ですが、1から100まで1行ごと出力するプログラムを書いてください。40バイトもあれば書けるよね。
・・・え?と思った人、その感覚は(普通のプログラマーとしては)正しいです。ところがCゴルファーからしてみると「40バイトもいらないでしょ」となります。
とりあえず普通のコードを書いてみましょう。
#include<stdio.h>
int main(void){
  int i;
  for(i=1;i<=100;i++){
    printf("%d\n",i);
  }
  return 0;
}
はい、正しいコードです。でも長いですよね。ちょっと縮めてみましょう。
main(i){for(;printf("%d\n",i++)<4;);}
これで37バイトです。いきなり縮んで意味不明だと思うので細かく説明していきます。
includeはいらない
gccの場合、よく使う関数はビルトイン関数になっているのでヘッダをインクルードする必要はありません。
変数宣言にintはいらない
グローバル変数と引数はintを書かなくてもコンパイラがint型だと判断してくれます。
anarchy golfの環境ではmain関数の第一引数は1になっているのでここを使ってしまえば初期化が必要なくなります。
グローバル変数は0で初期化されるのでこちらを使ってもいいのですが、main関数の引数にした方がセミコロンひとつ分短くなります。
関数の型にintはいらない
変数と同様に返り値はintだと判断してくれます。
returnはいらない
main関数はreturnを書かなくても大丈夫です。これはわかりますよね。
実はmain関数以外の関数でもいらないので値を返す必要のない時はreturnは省略します。
インクリメント
前置インクリメントは式の評価の前に、後置インクリメントは式の評価の後にインクリメントされます。(例外はあります。)
引数でインクリメントしてもコンパイラに怒られたりはしません。会社の上司には怒られます。
printfの帰り値
printfは出力した文字数を返すので100を出力するときに初めて4を返します。
なのでprintf()<4が終了条件になります。

まとめ

まとめるほどのこともないですが・・・。
いろいろ変なことしていますが、ショートコーディングを1ヶ月もすればいきなりmain(i){・・・と書き始めるようになります。
ここではショートコーディングになれることを目標としているので細かい技術よりも何となくの感じをつかんでもらえればそれでOKです。
「includeとかintとかreturnとかは書かないんだな」「mainの第一引数を使ってもいいんだな」ぐらいで十分です。
細かいところはテクニックのページで見ていきましょう。

コメントをかく


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

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

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