2011-02-16 20 views
8

Mi profesor y yo estamos discutiendo un poco sobre el operador + = en C. Él dice que + = o = + funcionará, pero no está seguro de por qué = + trabajos.C Programación: + = vs = +

int main() 
{ 
    int i = 0, myArray[5] = {1,1,1,1,1}; 

    while(i < 5) 
    { 
      myArray[i] += 3 + i; 
      printf("%d\n", myArray[i]); 
      i++; 
    } 

    system("pause"); 
} 

La salida rendirá 4, 5, 6, 7, 8. Cambio del operador + = a = + produce los mismos resultados. Sin embargo, = = no hace lo mismo que = - (lo cual es obvio ya que trata a los 3 como un 3).

Así gurús C:

  • ¿Por qué este trabajo con + =?
  • ¿Cómo trata un compilador C = + versus + =?
+3

¿Usando qué compilador produce los mismos resultados ??? –

+3

Al cambiar el operador a = + se obtiene '3,4,5,6,7'. Tal vez se olvidó de guardar el archivo fuente antes de volver a compilar o algo así. – mtrw

+2

Su profesor es incompetente y debería retirarse. –

Respuesta

22

He is wrong; += es completamente diferente de =+.

La expresión x =+ 3 se analiza como x = (+3).
Aquí, + se convierte en el (un poco inútil) operador unitario +. (lo contrario de la negación)

La expresión x =- 3 se analiza como x = (-3), utilizando el operador de negación unaria.

1

+ es también un operador unario como es -.

+0

Te estás perdiendo el salto lógico que hace que esto realmente responda la pregunta. –

+1

Para preguntas como esta (preguntas que no son API) me gusta proporcionar la respuesta menos específica que empujará el cartel en la dirección de la solución. Todo lo que aprendí y recordé llegué a mí mismo. Todo lo que olvidé fue cucharada. – Novikov

3

Código

myArray[i] += 3 + i; 

rendirá myArray[i] = myArray[i] + 3 + i;

mientras que

myArray[i] =+ 3 + i; 

produce myArray[i] = 3 + i

que es lo que tengo.

14

Su profesor es recordar antiguas versiones de C en el que =+, =-, =* etc, en efecto, significa lo mismo que +=, -=, etc. *= (estamos hablando anterior a la versión generalmente conocido como .. "K & R" aquí Version 6 UNIX, si la memoria sirve)

En actuales versiones de C, que no significan la misma cosa; las versiones con el signo igual primero se analizarán como si hubiera un espacio entre los iguales y lo que venga después. Esto sucede para producir un programa válido (aunque no es un programa que hace lo que espera) para =- y =+ porque - y + se pueden usar como operadores unarios.

=* o =/ podrían utilizarse para resolver el argumento.a *= 3 multiplicará a por tres, y a /= 3 se divide por tres, pero a =* 3 es un error semántico (porque unario * solamente se puede aplicar a los punteros) y a =/ 3 es un error de sintaxis (porque / puede no usarse como un unario operador).

+0

Sí, si mira el código en el libro de Leones, verá que deletrea al operador como '= +' (también contiene algunos otros ejemplos de C del período, como usar el operador '.' en no- tipos de estructura). – caf

+1

Aquí está el manual B (C se adaptó de B) en: http://cm.bell-labs.com/cm/cs/who/dmr/kbman.html. Muestra los operadores de asingment con el signo igual en la primera posición. –

+1

= + se cambió a + = en el cambio de la versión 6 de Unix a la versión 7 de Unix en algún momento de los 70, cuando se hicieron muchos otros cambios en el lenguaje C, en gran parte por el esfuerzo de transferirlo a máquinas distintas del PDP- 11. –