2011-10-19 8 views
6

La mayoría (pero solo conozco un número pequeño, así que no nos volvemos quisquillosos en ese punto) los idiomas de alto nivel admiten múltiples operadores de asignación diferentes.Compatibilidad con idiomas modernos + = pero no && =

a += 5; // increment a and assign result beack to a. 

Pero ninguno (que he mirado (de nuevo un número pequeño)) parecen apoyar la & & = operador.
La razón que pido poco vi esto:

// simplified. 
bool x = false; 


x = x && testA(); // perform test A/B/C/D stop on first failure. 
x = x && testB(); 
x = x && testC(); 
x = x && testD(); 

y me preguntaba por qué no podríamos utilizar:

x &&= testA(); // perform test A/B/C/D stop on first failure. 
x &&= testB(); 
x &&= testC(); 
x &&= testD(); 

La razón es que & & = No se admite en C/C++, que hecho pensamos por qué.

¿Existe una (sin intención juego de palabras) razón lógica para que el idioma es compatible con todos los otros operadores principales con una forma de asignación, pero no el & & = o = ||

Tengo un vago recuerdo de un argumento en contra estos, pero las búsquedas en google y SO son difíciles cuando su término de búsqueda es '& & =' y como resultado no encontré nada.

+1

Tenía _exactly_ este pensamiento hoy, porque en lua, '&&' es la palabra 'y', así que me pregunté cómo lo hicieron' && = ', y se dio cuenta de que no hay' && = ', en lua o en la mayoría de los idiomas –

Respuesta

1

&& y || son especiales en el sentido de que son, en la mayoría de los lenguajes, las únicas construcciones que proporcionan evaluación de cortocircuitos por lo que tiene sentido que sean tratados de manera diferente a los operadores normales sin cortocircuito cuando se trata de las formas abreviadas. La forma más fácil de evitar la confusión de &&= cortocircuitar o no es no incluirla en primer lugar.

-1

¿Cuándo realmente necesitarías esto? En general, cuando realiza operaciones booleanas, no está actualizando valores, sino que está calculando algo para una operación de una sola vez. Tu ejemplo no es muy realista; no hay muchos casos en los que realmente lo haría.

Además, en todos los idiomas que puedo pensar en la asignación aumentada solo existe para operaciones aritméticas y de bit, nunca operaciones booleanas.

+2

Es muy útil cuando el lado izquierdo no es booleano, pero tiene * verdad *. –

2

Perl apoya esto. Es muy práctico para poder escribir:

$x ||= $defaultX; 
+1

Creo que Perl admite todas las combinaciones posibles de todos los operadores y todo lo demás en el mundo? –

+1

@Uwe: Sí, lo hace (http://www.ozonehouse.com/mark/periodic/) – hugomg

1

La primera razón es que los idiomas le permiten llegar a su objetivo mediante el formulario "prolija". Después de eso, está mal visto agregar operadores para cada caso inusual. Parte de la razón es que el diseñador del lenguaje tiene que decidir sobre las precedencias del operador sabiamente. Esto no es tan fácil como parece: tome C como un ejemplo que arruinó las precedencias intuitivas en &, |, && y ||.

La segunda razón es que la mayoría de los idiomas modernos admiten alguna forma de excepciones. Su caso se puede reescribir fácilmente mediante el uso de excepciones con la bonificación adicional, que la persona que llama puede pasar la información sobre la falla más fácilmente.

Por lo tanto, la necesidad de un operador especial como este es bastante pequeña.

Oh, casi me pierdo el motivo más importante: C no los tiene. Lo que esto significa se describe mejor en A Brief, Incomplete, and Mostly Wrong History of Programming Languages:

1970 - Niklaus Wirth crea Pascal, un lenguaje de procedimiento. Los críticos deniegan inmediatamente a Pascal porque usa la sintaxis "x: = x + y" en lugar de la más familiar como "x = x + y". Esta crítica ocurre a pesar del hecho de que C aún no se ha inventado.

1972 - Dennis Ritchie inventa una poderosa arma que dispara hacia adelante y hacia atrás simultáneamente. No satisfecho con el número de muertes y mutilaciones permanentes de esa invención inventa C y Unix.

Esto simplemente muestra que C sigue siendo un atractor del que no puede escapar.

+0

Todavía no entiendo por qué hay un "mayor error" en ese título. : P – hugomg

+0

¿Algún comentario para el downvote (r)? –

0

A diferencia de + = y amigos, & & = no se asigna a las instrucciones de un solo hardware. Es una especie de prueba o claro.

Cuestiones relacionadas