鍋あり谷あり

テーマを決めずに適当に書いています。

私の知らなかった C++

久々にプログラミングの話。
昨日、また 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 とかつける必要があるらしい。

この仕様を知らなかったことについては、あまり修行が足りないという気持ちにはならなかった。

#写真と本文は関係ありません