JavaとC++の微妙な違い
JavaとC++で微妙に異なっている仕様についてメモしてみる
余剰演算子「%」の適用範囲
// C++ std::cout << 10 % 3 << std::endl; //OK std::cout << 10.0 % 3 << std::endl; //NG std::cout << 10 % 3.0 << std::endl; //NG std::cout << 10.0 % 3.0 << std::endl; //NG
// Java System.out.println(10 % 3); //OK System.out.println(10.0 % 3); //OK System.out.println(10 % 3.0); //OK System.out.println(10.0 % 3.0); //OK
という訳でこんな結果も取れる
// java System.out.println(9.4 % 1.3234234); //出力結果は0.13603620000000016
switchに使える型
実はJavaではlongに対してswitchはできない
// Java char x=10; //OK byte x=10; //OK short x=10; //OK int x=10; //OK long x=10; //NG switch(x) { case 10: System.out.println("10だよ"); break; case 20: System.out.println("20だよ"); break; }
条件判定するときにint型に暗黙的型変換されるから、longではナローイング変換となり、エラー
enum型
// C++ class X { public: enum E{ ET_1, ET_2, ET_3, }; }; int main() { X::E e = X::ET_1; // 違い1 switch(e) { // ↓違い2 case X::ET_1: std::cout << "ET_1" << std::endl; break; case X::ET_2: std::cout << "ET_2" << std::endl; break; case X::ET_3: std::cout << "ET_3" << std::endl; break; } return 0; }
// Java class X { public enum E { ET_1, ET_2, ET_3, } } public class Test { public static void main(String[]args) { X.E e = X.E.ET_1; // 違い1 switch(e) { // ↓違い2 case ET_1: System.out.println("ET_1"); break; case ET_2: System.out.println("ET_2"); break; case ET_3: System.out.println("ET_3"); break; } } }
- 違い1
- enum型の要素を使用するときに、型名が必要かどうか
- 違い2
- caseの中に書くときに、要素名だけでよいかどうか
まとめ
こういう細かいところで違ってたりすると混乱するねぇ