2012-01-20 20 views
5

Descubrí hoy que el framework .NET sigue el orden de operaciones BODMAS cuando se hace un cálculo. Es decir cálculos se llevan a cabo en el siguiente orden:Principio BODMAS en .NET

  • soportes
  • órdenes
  • División
  • Multiplicación
  • adición
  • Resta

Sin embargo he buscado en todo y no puede encontrar ninguna documentación que confirme que .NET definitivamente sigue este principio, ¿hay tales documentos en cualquier lugar? Estaría agradecido si pudieras señalarme en la dirección correcta.

+3

Esto depende del idioma. .NET es un marco. – Groo

+1

Para C# http://msdn.microsoft.com/en-us/library/6a71f45d(v=vs.80).aspx –

+0

De acuerdo con los documentos, la C# no sigue a BODMAS así que puede mostrar algún código que pruebe lo hace. –

Respuesta

23

Tenga en cuenta que C# no cumple con la regla BODMAS de la forma en que aprendió en la escuela. Suponga que tiene:

A().x = B() + C() * D(); 

que te pueden ingenuamente pensar que la multiplicación se "hace primero", entonces la adición, y la asignación pasado, y por lo tanto, esto es el equivalente a:

c = C(); 
d = D(); 
product = c * d; 
b = B(); 
sum = b + product; 
a = A(); 
a.x = sum; 

Pero eso no es lo que sucede La regla BODMAS solo requiere que las operaciones se realicen en el orden correcto; los operandos se pueden calcular en cualquier orden.

En C#, los operandos se calculan de izquierda a derecha. Así pues, en este caso, lo que sucedería es lógicamente lo mismo que:

a = A(); 
b = B(); 
c = C(); 
d = D(); 
product = c * d; 
sum = b + product; 
a.x = sum; 

También, C# no hace cada multiplicación antes cada adición. Por ejemplo:

A().x = B() + C() + D() * E(); 

se calcula como:

a = A(); 
b = B(); 
c = C(); 
sum1 = b + c; 
d = D(); 
e = E(); 
product = d * e; 
sum2 = sum1 + product; 
a.x = sum2; 

See, la adición más a la izquierda ocurre antes de la multiplicación; la multiplicación solo tiene que ocurrir antes de la más a la derecha Además.

Básicamente, la regla es "entrelazar la expresión correctamente entre paréntesis para que solo tenga operadores binarios, y luego evaluar el lado izquierdo de cada operador binario antes del lado derecho". Entonces nuestro ejemplo sería:

A().x = ((B() + C()) + (D() * E())); 

y ahora está claro. La adición más a la izquierda es un operando a la suma más a la derecha, y por lo tanto, la suma más a la izquierda debe ejecutarse antes de la multiplicación, porque el operando izquierdo siempre se ejecuta antes del operando derecho.

Si este tema le interesa, ver mis artículos sobre el mismo:

http://blogs.msdn.com/b/ericlippert/archive/tags/precedence/

+0

Excelente respuesta –

Cuestiones relacionadas