AOJの環境について
AOJ(Aizu Online Judge)の環境でC言語を使う場合のメモです。特にショートコーディング*1を行う場合、以下の点に注意する必要があります。なお、これらはあくまでショートコーディングを行うためのものであり、通常のプログラミングでは考慮する必要がない(あるいは考慮すべきでない)ことも含まれます。
- 基本的に、規格はC89に準拠しているものと思われます
- char型は8ビット、short型は16ビット、int型
およびlong型は32ビット、float型は32ビット、double型は64ビットです。- 標準的な仕様でしょう
- ポインタは64ビットです
- 以前は32ビットだったような気がします。AOJのシステムの更新により変更されたのかもしれません。
- リトルエンディアンが採用されています
- 通常は気にする必要はありませんが、たまにこれを利用してコードの短縮を行えることがあります
- 文字コードはASCIIです
- 整数において、負の数は2の補数表現です
- これも文字コードと同様
- 二項演算子のオペランドは、左から右の順に評価されます(多分)
- C言語の規格上は不定です
- 関数の引数は、右から左の順に評価されます
- 大域変数および引数宣言では、型がintであれば型名を省略できます
- 関数の戻り値の型は、intであれば型名を省略できます
- 文字リテラルについて、例えば'abcd'などの表記が可能です
- この場合、0x61626364と同じ値になります。例えば要素数30000以上の配列を宣言したい場合、a[30000]と書くよりa['~~']と書いた方が短く書けます。
- 配列宣言において、要素数は省略できます
- 例えば、double a[]; などの宣言が可能です。要素数は
01となるようです。
- 例えば、double a[]; などの宣言が可能です。要素数は
- main関数の第一引数は1です
- たまに使います
- main関数が0以外の値を返した場合、Runtime Errorとなります
- これは割と厄介な仕様です。この条件を満たすため、以下のいずれかを行う必要があります。
- 大域変数のメモリ配置は、変数の宣言順序とは必ずしも一致しないようです
- 定数EOFは-1です
- C言語の規格上は「負の整数」というような規定しかありませんが、大抵の環境では-1だと思います
- 関数putsは、0以外の値を返します
- ちょっと実験してみたところ、出力文字数(最後の改行含む)を返すようです
- #includeは省略できます
- #includeを省略しても、通常通り動く場合が多いです。ただし、中には#includeを書かないとコンパイルエラーとなったり、あるいは動作がおかしくなる関数もあります。要確認。
- #includeを省略した場合、コンパイラによる引数のチェックが甘くなります
- 引数の数が違ったり、あるいは型が違ったとしても、そのままコンパイルされる場合が多いです。
以上が、AOJのC言語における注意事項です。例外的に、リアクティブな問題(2273,2277,2410, 2414など)では、実行環境が以下のように異なります。なお、番号は上記のものに対応します。
- 規格はC99に準拠しているものと思われます
- 変数および引数の型は、intであっても省略できません
- 配列宣言において、要素数は省略できません
- main関数は、何も書かないでも0を返します
- 従って、上記で挙げたような対策が不要となります
- #includeは省略できません
これらの問題では、全体的にショートコーディングに不利な条件となります。ただし14番だけは、C89の環境よりも有利です。
以上、AOJでショートコーディングする際の注意事項でした。普通の人にとっては、あまり役には立たないと思います。
(2/16追記)
long型は64bitでした。訂正します。