AOJの環境について

AOJ(Aizu Online Judge)の環境でC言語を使う場合のメモです。特にショートコーディング*1を行う場合、以下の点に注意する必要があります。なお、これらはあくまでショートコーディングを行うためのものであり、通常のプログラミングでは考慮する必要がない(あるいは考慮すべきでない)ことも含まれます。

  1. 基本的に、規格はC89に準拠しているものと思われます
  2. char型は8ビット、short型は16ビット、int型およびlong型は32ビット、float型は32ビット、double型は64ビットです。
    • 標準的な仕様でしょう
  3. ポインタは64ビットです
    • 以前は32ビットだったような気がします。AOJのシステムの更新により変更されたのかもしれません。
  4. リトルエンディアンが採用されています
    • 通常は気にする必要はありませんが、たまにこれを利用してコードの短縮を行えることがあります
  5. 文字コードはASCIIです
    • C言語の規格上はASCII以外の文字コードもありうるのですが、少なくとも競技の環境では、ほぼ確実にASCIIと思って間違いないでしょう
  6. 整数において、負の数は2の補数表現です
  7. 二項演算子オペランドは、左から右の順に評価されます(多分)
    • C言語の規格上は不定です
  8. 関数の引数は、右から左の順に評価されます
  9. 大域変数および引数宣言では、型がintであれば型名を省略できます
  10. 関数の戻り値の型は、intであれば型名を省略できます
  11. 文字リテラルについて、例えば'abcd'などの表記が可能です
    • この場合、0x61626364と同じ値になります。例えば要素数30000以上の配列を宣言したい場合、a[30000]と書くよりa['~~']と書いた方が短く書けます。
  12. 配列宣言において、要素数は省略できます
    • 例えば、double a[]; などの宣言が可能です。要素数は01となるようです。
  13. main関数の第一引数は1です
    • たまに使います
  14. main関数が0以外の値を返した場合、Runtime Errorとなります
    • これは割と厄介な仕様です。この条件を満たすため、以下のいずれかを行う必要があります。
    1. return 0;
      • 普通はこうしますが、長いです
    2. exit(0);
      • return 0; よりはやや短く書けます
    3. 計算結果が0になる式(ただし定数式でないもの)の値を、大域変数に代入する
      • これにより特定のレジスタの値が書き換わり、0が返るようになることがあります。なお、最適化のためか、局所変数に代入しても効果はないことが多いです。また、定数式の代入も効果がないことが多いです。
    4. 計算結果が0になる乗算や除算を行い、それを条件式として用いる
      • forの継続条件などにこういったものを用いると、効果があることもあります。
  15. 大域変数のメモリ配置は、変数の宣言順序とは必ずしも一致しないようです
  16. 定数EOFは-1です
    • C言語の規格上は「負の整数」というような規定しかありませんが、大抵の環境では-1だと思います
  17. 関数putsは、0以外の値を返します
    • ちょっと実験してみたところ、出力文字数(最後の改行含む)を返すようです
  18. #includeは省略できます
    • #includeを省略しても、通常通り動く場合が多いです。ただし、中には#includeを書かないとコンパイルエラーとなったり、あるいは動作がおかしくなる関数もあります。要確認。
  19. #includeを省略した場合、コンパイラによる引数のチェックが甘くなります
    • 引数の数が違ったり、あるいは型が違ったとしても、そのままコンパイルされる場合が多いです。

以上が、AOJのC言語における注意事項です。例外的に、リアクティブな問題(2273,2277,2410, 2414など)では、実行環境が以下のように異なります。なお、番号は上記のものに対応します。

  1. 規格はC99に準拠しているものと思われます
  2. 変数および引数の型は、intであっても省略できません
  3. 配列宣言において、要素数は省略できません
  4. main関数は、何も書かないでも0を返します
    • 従って、上記で挙げたような対策が不要となります
  5. #includeは省略できません

これらの問題では、全体的にショートコーディングに不利な条件となります。ただし14番だけは、C89の環境よりも有利です。

以上、AOJでショートコーディングする際の注意事項でした。普通の人にとっては、あまり役には立たないと思います。


(2/16追記)
long型は64bitでした。訂正します。

*1:コードゴルフという呼び方もありますが、本ブログではショートコーディングに統一します。