Operadores (C# y Java)
Actualización: noviembre 2007
C# ofrece todos los operadores compatibles con Java aplicables, como se muestra en la tabla siguiente. Al final de la tabla, verá algunos operadores nuevos disponibles en C#, pero no en Java:
Categoría |
Símbolo |
---|---|
Unario |
++--+-!~() |
Multiplicativo |
*/% |
Sumatorio |
+ - |
Desplazamiento |
<< >> |
Relacionales |
< > <= >= instanceof |
Igualdad |
== != |
AND lógico |
& |
XOR lógico |
^ |
OR lógico |
| |
AND condicional |
&& |
OR condicional |
|| |
Condicional |
? : |
Asignación |
= *= /= %= += -= <<= >>= &= ^= |= |
Tipo de operando |
typeof |
Tamaño del operando |
sizeof |
Exigir comprobación de desbordamiento |
checked |
Suprimir comprobación de desbordamiento |
unchecked |
El único operador de Java no disponible en C# es el operador de desplazamiento (>>>). Este operador está presente en Java debido a la ausencia de variables sin signo en ese lenguaje, para los casos en que se requiere el desplazamiento a la derecha para insertar un uno (1) en los bits más significativos.
C# admite variables sin signo y, por consiguiente, sólo necesita el operador >> estándar. Este operador genera resultados diferentes, lo que depende de si el operando está con o sin signo. Desplazar a la derecha un número sin signo inserta un 0 en el bit más significativo, mientras que desplazar a la derecha un número con signo copia el bit más significativo anterior.
Operadores Checked y Unchecked
Las operaciones aritméticas producirán desbordamiento si el resultado es demasiado grande para el número de bits asignados al tipo de datos en uso. Ese desbordamiento se puede comprobar u omitir en una operación aritmética integral dada con las palabras clave checked y unchecked. Si se trata de una expresión constante que utiliza checked, se genera un error en tiempo de compilación.
El siguiente es un ejemplo simple que muestra el uso de estos operadores:
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
}
}
En este código, el operador unchecked evita el error en tiempo de compilación que, de lo contrario, se produciría por la instrucción siguiente:
short d = unchecked((short)(10000 * 10000)); // unchecked
La siguiente expresión utiliza el operador unchecked de manera predeterminada, por lo que el valor produce un desbordamiento pero no lo comunica:
short c = (short)(a * b); // unchecked by default
Con el operador checked, se puede exigir que se compruebe el desbordamiento de la expresión en tiempo de ejecución:
short e = checked((short)(a * b)); // checked - run-time error
Al asignar los primeros dos valores a d y c se produce un desbordamiento, que no se comunica, con un valor de -7936 cuando se ejecuta el programa, pero al intentar multiplicar el valor por e con checked(), el programa producirá una excepción OverflowException.
Nota: |
---|
También puede controlar si desea comprobar el desbordamiento aritmético en un bloque de código con el modificador de compiladores de línea de comandos (/checked) o directamente en Visual Studio por cada proyecto. |