mugetsu
Me encontré con =+
a diferencia del estándar +=
hoy en algún código C; No estoy muy seguro de lo que está pasando aquí. Tampoco pude encontrarlo en la documentación.
ataúd de jerry
En antiguo versiones de C, =+
era equivalente a +=
. Se han encontrado restos junto con los primeros huesos de dinosaurio.
Por ejemplo, B introdujo operadores de asignación generalizada, utilizando
x+=y
agregary
ax
. La notación provino de Algol 68 a través de McIlroy, quien la incorporó en su versión de TMG. (En B y principios de C, el operador se deletreaba=+
en vez de+=
; este error, reparado en 1976, fue inducido por una manera fácil y seductora de manejar la primera forma en el analizador léxico de B.)
[The Development of the C Language, Dennis Ritchie. Copyright ACM, 1993. Internal citations omitted.]
Desde mediados de la década de 1970, no tiene un significado especial, es solo un =
seguido de un +
.
-
Pero ya no se admite porque es ambiguo con unario +.
–Paul Tomblin
27 de septiembre de 2011 a las 18:34
-
puedo confirmar eso
=+
originalmente era el mismo que el actual+=
. No recuerdo si ambos eran válidos desde el principio o=+
era la única opción inicialmente, pero en cualquier caso se abandonó (con razón) debido a la ambigüedad.– Lame caliente
27 de septiembre de 2011 a las 18:48
-
Puede haber sido solo una cosa de VAX, pero juro que me enseñaron que += era un preincremento, y =+ era un incremento posterior, que, según recuerdo, casi siempre hacemos exactamente lo mismo … pero no en problemas complejos de orden de operación.
– Eric Brown – California
27 de septiembre de 2011 a las 21:38
-
@markgz: consulte la página 5 de Dennis papel (advertencia: Posdata) sobre la historia de C.
– Jerry Ataúd
27/09/2011 a las 21:56
-
Gracias, Jerry. Para los interesados, el papel dice lo siguiente sobre “=+”: “…este error, reparado en 1976…”. 1976 fue antes de mi época.
– markgz
27 de septiembre de 2011 a las 23:22
jonathan leffler
Puede encontrar pruebas de la notación anterior en la 7.ª edición del Manual UNIX (Vol. 2a) con fecha de enero de 1979, disponible en línea en http://cm.bell-labs.com/7thEdMan/ (no disponible desde aproximadamente julio de 2015; la versión de junio de 2015 ahora está disponible a través de WayBack Machine en http://cm.bell-labs.com/7thEdMan/ – o en https://9p.io/7thEdMan/).
El capítulo se titula ‘C Manual de referencia‘ por Dennis M. Ritchie, y está en la versión PDF del manual, pero no en la versión HTML. En la parte correspondiente dice:
7.14.1 lvalue = expresión
El valor de la expresión reemplaza al del objeto al que hace referencia el lvalue. No es necesario que los operandos tengan el mismo tipo, pero ambos deben ser int, char, float, double o pointer. Si ninguno de los operandos es un puntero, la asignación se lleva a cabo como se esperaba, posiblemente precedida por la conversión de la expresión de la derecha. Cuando ambos operandos son int o punteros de cualquier tipo, nunca se realiza ninguna conversión; el valor de la expresión simplemente se almacena en el objeto al que hace referencia el lvalue. Por lo tanto, es posible generar punteros que provocarán excepciones de direccionamiento cuando se utilicen.
7.14.2 lvalue =+ expresión
7.14.3 lvalue =- expresión
7.14.4 lvalue =* expresión
7.14.5 lvalue =/ expresión
7.14.6 lvalue =% expresión
7.14.7 lvalue =>> expresión
7.14.8 lvalue = 7.14.9 lvalue =& expresión
7.14.10 lvalue =^ expresión
7.14.11 lvalor = | expresiónEl comportamiento de una expresión de la forma ”E1 =op E2” puede inferirse tomándola como equivalente a ”E1 = E1 op E2”; sin embargo, E1 se evalúa solo una vez. Además, están prohibidas expresiones como ”i =+ p” en las que se añade un puntero a un número entero.
Aparte, hay un papel ‘Evolución de C‘ de L Rosler en ‘UNIX® SYSTEM: Readings and Applications, Volume II’, publicado originalmente por AT&T como Technical Journal en octubre de 1984, publicado más tarde en 1987 por Prentice-Hall (ISBN 0-13-939845-7). Una sección de eso es:
tercero Gestión de cambios incompatibles
Inevitablemente, algunos de los cambios que se realizaron alteran la semántica de los programas válidos existentes. Aquellos que mantienen los diversos compiladores utilizados internamente intentan asegurarse de que los programadores tengan una advertencia adecuada de que dichos cambios tendrán efecto y que la introducción de una nueva versión del compilador no obliga a que todos los programas se vuelvan a compilar inmediatamente.
Por ejemplo, en las primeras implementaciones la expresión ambigua
x=-1
se interpretó en el sentido de “disminuir x en 1”. Ahora se interpreta que significa “asignar el valor -1 a x”. Este cambio tuvo lugar en el transcurso de tres importantes lanzamientos anuales. En primer lugar, el compilador y ellint
El verificador de programa se modificó para generar un mensaje de advertencia sobre la presencia de una operación de asignación “anticuada”, como=-
. A continuación, los analizadores se cambiaron a la nueva semántica y los compiladores advirtieron sobre una operación de asignación ambigua. Finalmente, se eliminaron los mensajes de advertencia.Soporte para el uso de una “inicialización antigua”
int x 1;
(sin signo igual) se eliminó mediante una estrategia similar. Esto ayuda al analizador a producir diagnósticos de errores de sintaxis más inteligentes.
Como era de esperar, algunos usuarios de C ignoraron las advertencias hasta que la introducción de los compiladores incompatibles los obligó a elegir entre cambiar su código fuente obsoleto o asumir el mantenimiento de sus propias versiones del compilador. Pero, en general, la estrategia de cambio gradual tuvo éxito.
Además, en Brian W Kernighan y Dennis M Ritchie
El lenguaje de programación C, 1.ª ed. (1978), en la página 212 del Apéndice A, §17 Anacronismosdice:
Las versiones anteriores de C usaban la forma
=op
en vez deop=
para operadores de asignación. Esto conduce a ambigüedades, tipificadas por:x=-1
que en realidad disminuye
x
desde el=
y el-
son adyacentes, pero que fácilmente podrían estar destinados a asignar-1
ax
.
Es solo una asignación seguida de una suma más.
#include <stdio.h>
int main() {
int a;
a =+ 5;
printf("%d\n",a);
return 0;
}
Imprime “5”. Cambio a =+ 5
a a =- 5
e imprime “-5”. Una forma más fácil de leer a =+ 5
es probable a = +5
.
-
Esa prueba necesita inicializarse a a algo distinto de cero. Si utiliza
int a = 3;
obtienes el mismo resultado?– Comida manual
28 de septiembre de 2011 a las 0:38
-
@Hand-E-Food: su prueba no se inicializa
a
a cero o cualquier otro valor, en realidad.– Kip
29 de septiembre de 2011 a las 17:23
-
No fue pensado como una prueba. La razón por la que puse la inicialización de
a
en su propia línea era hacerlo más similar a lo que pensé que se vería en el código fuente de los OP; tal vez debería haber puesto/*other code*/
entre la declaración y la cesión.– usuario786653
29 de septiembre de 2011 a las 18:36
una masa
Es una antigua variante desaparecida de +=
. En los compiladores modernos, esto es equivalente a un operador de asignación seguido de un operador unario. +
.
pienso
a =+ 5;
debe ser equivalente a
a = (+5);
y por lo tanto ser código de muy mal estilo.
Probé el siguiente código e imprimió “5”:
#include <iostream>
using namespace std;
int main()
{
int a=2;
a =+ 5;
cout << a;
}
-
Esta pregunta es sobre C, y estás hablando de C++.
– usuario142019
27 de septiembre de 2011 a las 18:47
-
Obtengo el mismo comportamiento con un archivo .c en VS2010.
–Steve Rowe
27 de septiembre de 2011 a las 19:18
niko
Después de leer su pregunta, acabo de investigar sobre esto. Déjame decirte lo que he encontrado. Lo probé en gcc y turboc. No lo aseguré en Visual Studio porque no lo he instalado en mi PC
int main()
{
int a=6;
a =+ 2;
printf("%d",a);
} o/p , a value is 2
int main()
{
int a=6;
a =- 2;
printf("%d",a);
} o/p , a value is -2
No sé acerca de las otras respuestas, ya que dijeron que es una versión antigua de C. Pero los compiladores modernos los tratan como un valor a asignar (eso es positivo o negativo, nada más que eso) y el siguiente código me hace más seguro.
int main()
{
int a=6;
a =* 2; \\ Reporting an error inavlid type of argument of unary *
printf("%d",a);
}
if *= is equal to =* then it should not report error but its throwing an error
-
Esta pregunta es sobre C, y estás hablando de C++.
– usuario142019
27 de septiembre de 2011 a las 18:47
-
Obtengo el mismo comportamiento con un archivo .c en VS2010.
–Steve Rowe
27 de septiembre de 2011 a las 19:18
hassan uddin
usando “=+” solo está asignando el operando es positivo, por ejemplo, int a = +10; lo mismo que para el número negativo int a = -10;
¿Ese fragmento de código funciona como se esperaba? Si no, eso puede ser un error tipográfico.
– Mark Jones
27 de septiembre de 2011 a las 18:33
@TimCooper bastante seguro, está en muchas líneas y el código se compila bien. estoy usando microsoft visual studios
– mugetsu
27 de septiembre de 2011 a las 18:33
@SteveRowe: VS (como cualquier compilador desde que la tierra se enfrió) lo trata como = (+).
– Jerry Ataúd
27 de septiembre de 2011 a las 22:02
Simplemente no puedo ver por qué estas preguntas interesantes, pero fundamentalmente triviales, puro entretenimiento, siempre reciben mucha atención (y “me gusta”) con docenas de idéntico respuestas, mientras que las personas que preguntan cosas serias a menudo tienen su pregunta ignorada y 0 respuestas. Responder preguntas triviales no requiere esfuerzo. Respondamos a las difíciles.
– gd1
28 de septiembre de 2011 a las 14:26
@gd1: es quizás el mayor defecto del modelo StackExchange. Estas preguntas no solo son populares, sino que generalmente contradicen la directriz de que las preguntas deben “basarse en los problemas reales que enfrenta” (faq), lo que hace que la directriz sea ridículamente disonante con el uso real del sitio por parte de la comunidad. En resumen, las preguntas menos útiles reciben las puntuaciones más altas, exactamente lo contrario del propósito de la votación. Levanté esto en meta pero me derribaron.
–Igby Largeman
26/10/2011 a las 18:51