precedencia y asociativos en C

En un segmento de código, vi esta forma sin compactar:

while(p1>=str1)
 {
  *p2 = *p1;
  p1--;
  p2++;
}

mientras que la forma compactada se parece a esto:

 while(p1>=str1)
 {
   *p2++ = *p1--;
 }

lo que hace el código se muestra claramente en la forma no compactada, primero copia el contenido de los punteros antes de incrementar el p2 y decrementar el p1, pero ¿cómo podría darse que la precedencia ++ sea mayor que el operador de asignación en C? Pensé que podría haber algún operador () para forzar esto, pero en el libro es correcto. ¿Alguien puede explicar esto? Gracias

preguntado el 27 de julio de 12 a las 15:07

3 Respuestas

La precedencia simplemente afecta cómo se analiza el código, es decir, qué ++ se refiere a. Por eso esto:

*p2++ = *p1--;

es equivalente a esto:

(*(p2++)) = (*(p1--));

Pero la semántica de ++ son para evaluar el valor original, y luego para incrementar el valor. Así que la asignación usará los valores antiguos de p1 y p2, y luego, después de realizar la asignación, los incrementará y disminuirá.

Respondido 27 Jul 12, 16:07

pero ¿por qué no se usan los corchetes entonces en este caso? Pensé que los paréntesis deberían haberse usado sin ellos, la sintaxis no es tan correcta; y esta es la pregunta, ¿por qué la sintaxis es correcta? - helpdesk

La sintaxis es correcta porque los operadores de posfijo no cuentan como parte de la evaluación de la declaración hasta después de que se evalúa la declaración (no es exactamente correcto, pero es una manera fácil de pensar en ello). De hecho, aunque no estoy seguro de si este también es el caso con C, recuerdo haber leído que no se recomienda el uso de operadores postfix en C++ porque hacen que se produzca una copia temporal de la variable a la que se aplica el operador, supuestamente para utilizar el valor anterior mientras se permite almacenar el nuevo valor. - JAB

p2++ expresión da el valor de p2 y no p2 + 1. La operación de incremento se realiza en el punto de secuencia.

Respondido 27 Jul 12, 15:07

Los programas ++ y -- Los operadores de sufijo surten efecto después de que se realiza la declaración en la que están incluidos. La precedencia afecta cómo se agrupan los tokens y cómo se genera el árbol de sintaxis (probablemente estoy usando el vocabulario incorrecto aquí) para la declaración.

Básicamente, *p2++ = *p1--; es equivalente a *p2 = *p1; p2 += 1; p1 -= 1;

Sin embargo, tenga cuidado con los operadores de post y prefijo; haciendo algo como p2 = p1++ * p1--; se considera un comportamiento indefinido, creo.

Respondido 27 Jul 12, 16:07

(p1++)-- no es válido en C como p1++ no es un valor l. - Guau

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.