operator historia descargar definicion caracteristicas c++ c operators history

descargar - historia de c++



¿Es esto->> un operador antiguo o un error tipográfico/error? (3)

Aprendí C en 1992, y estoy 100% seguro de que no existía tal operador en ese entonces.

Del contexto, p->>x[5] , podemos deducir que parece hacer exactamente lo mismo que el operador de flecha más familiar, -> . Por lo tanto, es probable que sea un error tipográfico.

Alternativamente, podría ser un problema de codificación al transcribir el código a HTML. Si miras la fuente de esa página, puedes ver que tiene una extraña mezcla de códigos de escape y caracteres literales < y > :

<TT><B>#include &lt;stdlib.h><BR>

En el curso de mi lectura, me topé con el Informe de defectos nº 51 del WG14, escrito en 1993 (o quizás en 1893, que dejaron el siglo y el milenio). En el ejemplo de código allí, aparentemente un operador deletreado ->> se usa en un puntero a una struct . No puedo encontrarlo en las tablas de precedencia de operadores que he encontrado, así que me pregunto si es o fue alguna vez un operador, y si es así, ¿qué hace (o hizo, según sea el caso) este operador?

Al principio pensé que era un error tipográfico, pero se reproduce dos veces más en el texto y otra vez en el ejemplo de código en la respuesta a la pregunta, y me cuesta creer que se haya pasado al menos a dos expertos en C sin estar Noté, cuando saltó a un novato como yo. También se encuentra en el punto focal del código, es muy fácil de notar y nunca se corrigió.

Aquí está el código con sangría añadida:

#include <stdlib.h> struct A { char x[1]; }; main() { struct A *p = (struct A *) malloc(sizeof(struct A) + 100); p->>x[5] = ''?''; /* This is the key line [for both them and us] */ return 0; }

Intenté compilar este código con un compilador de C y C ++ y no se pudo analizar en ninguno de los dos. Tal vez este fue un operador en una versión anterior de C que ya no se usa?

Esto se siente sospechosamente como el ¿Cuál es el nombre de este operador: "->"? Pregunta, pero no creo que sea una combinación de otros dos operadores, no veo cómo puede dividirse y ser válido.


Es probable que esto haya sido un error de transcripción, pero creo que sería útil escribir cómo un compilador de C real interpretaría esta construcción, de todos modos, solo para aclarar que no es un truco inteligente. Lo primero que es importante saber es esta oración, de C11 §6.5.4p4 (técnicamente, N1570; este lenguaje no ha cambiado desde C89, aunque el número de la sección fue probablemente diferente; el énfasis es mío):

Si el flujo de entrada se ha analizado en tokens de preprocesamiento hasta un carácter determinado, el siguiente token de preprocesamiento es la secuencia más larga de caracteres que podrían constituir un token de preprocesamiento.

Eso significa que la cadena de seis caracteres " p->>x" debe ser tokenizada como p -> > x , no p - >> x o p - > > x . (En realidad, no importa en este caso, sería un error de sintaxis de cualquier manera, pero esta regla puede ser la diferencia entre un análisis del programa como se pretende y no; que se interpreta como x++ ++ +y , no como x++ + ++y , aunque solo este último es una expresión bien formada).

Lo siguiente que debe saber es simplemente que el argumento de la derecha del operador -> debe ser un identificador , según las reglas gramaticales para expresión-postfix en §6.5.2. Obviamente > no es un identificador, por lo que tenemos un error de sintaxis definido.