演算子 (C# と Java の比較)
更新 : 2007 年 11 月
C# には、Java でサポートされている、適用可能なすべての演算子が用意されています。これらの演算子の一覧を以下に表に示します。表の最後に、C# で使用でき、Java で使用できない新しい演算子を示します。
カテゴリ |
記号 |
---|---|
単項演算 |
++--+-!~() |
乗法演算 |
*/% |
加法演算 |
+ - |
シフト |
<< >> |
関係演算 |
< > <= >= instanceof |
等値演算 |
== != |
論理 AND |
& |
論理 XOR |
^ |
論理 OR |
| |
条件 AND |
&& |
条件 OR |
|| |
条件 |
? : |
代入 |
= *= /= %= += -= <<= >>= &= ^= |= |
オペランドの型 |
typeof |
オペランドのサイズ |
sizeof |
オーバーフロー チェックの適用 |
checked |
オーバーフロー チェックの中止 |
unchecked |
Java の演算子の中で C# で使用できないのは、シフト演算子 (>>>) だけです。この演算子が Java に存在するのは、Java には符号なし変数がないためであり、最上位ビットに 1 を挿入するために右シフトが必要な場合に対応するためです。
C# は、符号なし変数をサポートするため、標準の >> 演算子しか必要としません。この演算子の結果は、オペランドが符号付きであるか、符号なしかによって異なります。符号なし数値を右シフトすると最上位ビットに 0 (ゼロ) が挿入され、符号付き数値を右シフトすると、直前の最上位ビットがコピーされます。
checked 演算子と unchecked 演算子
算術演算の結果が、使用中のデータ型に割り当てられているビット数に対して大きすぎるとオーバーフローが発生します。このようなオーバーフローは、特定の整数算術演算で checked キーワードや unchecked キーワードを使用することによってチェックしたり、無視したりできます。式が、checked を使用している定数式である場合は、コンパイル時にエラーが生成されます。
これらの演算子の使い方を示す簡単な例を次のコードに示します。
class TestCheckedAndUnchecked
{
static void Main()
{
short a = 10000;
short b = 10000;
short c = (short)(a * b); // unchecked by default
short d = unchecked((short)(10000 * 10000)); // unchecked
short e = checked((short)(a * b)); // checked - run-time error
System.Console.WriteLine(10000 * 10000); // 100000000
System.Console.WriteLine(c); // -7936
System.Console.WriteLine(d); // -7936
System.Console.WriteLine(e); // no result
}
}
このコードでは、unchecked 演算子を使用することで、本来ならば次のステートメントによって生成されるコンパイル時のエラーが回避されます。
short d = unchecked((short)(10000 * 10000)); // unchecked
次の式は既定で unchecked となるので、値が通知なしでオーバーフローします。
short c = (short)(a * b); // unchecked by default
checked 演算子を使用することにより、実行時に式に対してオーバーフロー チェックを適用できます。
short e = checked((short)(a * b)); // checked - run-time error
最初の 2 つの値を d と c に割り当てると、プログラムの実行時に -7936 の値が通知なしでオーバーフローしますが、checked() を使用して e の値を乗算しようとすると、プログラムは OverflowException をスローします。
メモ : |
---|
コードのブロックで算術オーバーフローをチェックするかどうかは、コマンド ライン コンパイラ スイッチ (/checked) を使用して制御することも、Visual Studio でプロジェクトごとに直接制御することもできます。 |