C Precedencia del operador con incrementos de puntero.

Estoy tratando de entender una línea de código C que incluye el uso de un puntero para estructurar el valor (que también es un puntero a algo).

Ejemplo de código C:

// Given typedef struct { uint8 *output uint32 bottom } myType; myType *e; // Then at some point: *e->output++ = (uint8) (e->bottom >> 24); 

Fuente: http://tools.ietf.org/html/rfc6386#page-22

Mi pregunta es:

  • ¿Qué hace exactamente esa línea de código C?

“¿Qué hace exactamente esa línea de código C?”

Pierda mucho tiempo teniendo que leerlo con cuidado, en lugar de saberlo de un vistazo. Si estuviera revisando el código de eso, se lo devolvería al autor y le diría que lo dividiera en dos líneas.

Las dos cosas que hace es guardar algo en e-> output, luego avanzar e-> output al siguiente byte. Creo que si necesita describir el código con dos partes, debería estar en dos líneas con dos declaraciones separadas.

Como lo señaló Deduplicator en los comentarios anteriores, puede resultar útil observar una tabla de precedencia de operadores .

  • *e->output++ = ... significa “asignar valor ... a la ubicación a la que e->output señala la e->output , y dejar que e->output apunte a una nueva ubicación 8 bits más adelante (porque la output es de tipo uint8 ) .
  • (uint8) (e->bottom >> 24) luego se evalúa para obtener un valor para ...

La línea

 *e->output++ = (uint8) (e->bottom >> 24); 

hace lo siguiente:

  1. Encuentre el campo bottom de la estructura apuntada por el puntero e .
  2. Obtener el valor de 32 bits de ese campo.
  3. Cambie ese valor a la derecha 24 bits.
  4. Vuelva a interpretar ese valor como uint8_t , que ahora contiene el byte de orden superior.
  5. Encuentra el campo de output de la estructura. Es un puntero a uint8_t .
  6. Almacene el uint8_t que uint8_t anteriormente en la dirección uint8_t por la output .
  7. Y finalmente, agregue 1 a la output , haciendo que apunte a la siguiente uint8_t .

El orden de algunas de esas cosas podría reorganizarse un poco siempre que el resultado se comporte como si se hubiera hecho en ese orden. La precedencia del operador es una pregunta completamente separada del orden en que se realizan las operaciones, y no es realmente relevante aquí.