久々にプログラミングの話。
昨日、また C++ の私の知らない言語仕様を発見した。C++ は発見に満ちている。
以下の通り:
void foo( int ){ cout << "int" << endl; } void foo( long ){ cout << "long" << endl; } void foo( long long ){ cout << "long long" << endl; } void foo( unsigned int ){ cout << "unsigned int" << endl; } void foo( unsigned long){ cout << "unsigned long" << endl; } void foo( unsigned long long ){ cout << "unsigned long long" << endl; } void test() { foo( 1 ); // int foo( 0x1 ); // int foo( 4294967295 /* == 2**32-1 */ ); // unsigned long foo( 0xFFFFFFFF /* == 2**32-1 */ ); // unsigned int foo( 4294967296 /* == 2**32 */ ); // g++ ではエラー。cl では long long foo( 0x100000000 /* == 2**32 */ ); // g++ ではエラー。cl では long long }
同じ値を、10進数で書いた場合と16進数で書いた場合で型が違うことがある。
必ず違うのではなく、値によって動作が違うというところが難しい。
ちなみにたぶんこれで仕様通り。
コンパイラ作る人も大変だと思う。
4294967296 と書いたときの動作は、g++ の方が好ましい。g++ で unsigned long に入らない値を書く場合は LL とかつける必要があるらしい。
この仕様を知らなかったことについては、あまり修行が足りないという気持ちにはならなかった。
#写真と本文は関係ありません