significa que prioridad operadores operador logicos lenguaje jerarquia condicional asignacion c compiler-construction operators history algol

que - operadores logicos en c++



¿Qué_did_ los operadores C// y //do? (8)

¡Especulación!

Si tiene espacios alrededor de ellos, entonces:

a // b ===> a / b a // b ===> a / b

Lógica: la fase de preprocesamiento tiene que ocuparse de la barra invertida y de un carácter posterior, y es bastante probable que trate el espacio de barra invertida como espacio, y barra diagonal inversa como barra diagonal.

Dicho esto, tanto el compilador SUN C (versión 12) como el compilador GNU C (versión 4.4) rechazan el código que contiene la barra diagonal inversa. Pero podría creer fácilmente que los preprocesadores C antiguos y predeterminados fueron menos cuidadosos al respecto.

Cumplimiento de estándares

Los operadores nunca han sido parte de una versión oficial de C.

Además, el estándar no permitiría la interpretación que di (sección 5.1.1.2 Fases de traducción, tanto en C89 como en C99), pero los compiladores no estándar no están limitados por el estándar, por supuesto.

Se agregó después de que se publicó la fuente:

¡Interesante! Entonces parece plausible para '' a = b // c; ''para asignar el maxiumum de byc a a, y'' a = b // c; ''hacer el mínimo (o, como Greg Hewgill señaló, más probable viceversa). Y, en aquellos días, era probable que los operadores modernos '' += '' todavía se escribieran como '' =+ '' y de hecho eran dos fichas ( no hay evidencia que apoye esta afirmación, falla la memoria otra vez ), entonces la hipotética '' a =// b; ''(o, en notación moderna,'' a //= b; '') habría sido el operador de asignación máxima, etc.

También se me ocurre que el discurso de Thompson ACM Turing Award '' Reflections on Trust Trust '' es de alguna manera relevante.

Cualquiera puede "declarar" sus propios operadores en C ... ¡eso es si uno es un gurú de compilador de C y tiene el código fuente del compilador de C! ;-)

Preguntas adicionales para acertar:

  1. ¿Cómo se hacen estas operaciones en C99? gcc? ...
  2. ¿Y por qué se / / & soltó?
  3. ¿Para qué tipos fueron válidos los operadores / / y / /?

Google para "/ / / /" naturalmente no devuelve nada. Wikipedia no tiene una página para / / ni / /. Pero lo he visto formar operadores similares integrados en las entidades de caracteres XML.

Fuente agregada: Encontré el ejemplo ofensivo en el archivo fuente cc del PDP "c00.c":

/* * Return the next symbol from the input. * peeksym is a pushed-back symbol, peekc is a pushed-back * character (after peeksym). * mosflg means that the next symbol, if an identifier, * is a member of structure or a structure tag or an enum tag */ symbol() { ... case BSLASH: if (subseq(''/'', 0, 1)) return(MAX); goto unkn; case DIVIDE: if (subseq(''//', 0, 1)) return(MIN); if (subseq(''*'',1,0)) return(DIVIDE); ... } Implementaciones reales: los operadores / / y / / datan de la Sexta Edición de Unix 1975 (hasta ahora). Ejemplos: Unix V6 (1975), Unix V7 (1979) y más actualmente BSD 2.11 (1992-2008)


C nunca ha tenido esos operadores.

Normalmente / sería un código de escape en algunos sistemas de cadenas, no estoy seguro de que / / haya tenido algún significado.


Dudo que alguna vez hayan querido decir algo. Si alguna vez lo hicieron, fue hace mucho tiempo. Los únicos operadores importantes que conozco que se han eliminado de C fueron = + y = -, que fueron sinónimos tempranos de + = y - =. Es posible que desee ver la página C primordial de DMR en busca de pruebas.


El Caret ( ^ ) realiza una exclusiva en bits o.

No creo que haya un operador "V". Esa es la letra ''V'' (o algo que se parece mucho). Alguien podría querer nombrar una variable que.


Ninguno / / y / se definen como operadores en el estándar ISO C89, y no creo que alguna vez se hayan definido en ninguna versión anterior. Y definitivamente no están definidos en C99 hasta donde yo sé.

Aquí hay un borrador del estándar ANSI C89, para referencia: http://flash-gordon.me.uk/ansi.c.txt

(Probablemente eres víctima de alguna extraña magia preprocesadora arcana)


No estoy seguro de // , pero // es una construcción válida. Se usa para colocar las dos barras de un comentario de una sola línea en líneas separadas. Por ejemplo:

// / Comment content

Esto funciona porque el carácter de barra invertida se escapa de la nueva línea y el analizador continúa como si no estuviera allí. Esto no funcionará si hay un espacio después de la barra invertida o si la segunda barra diagonal está indentada. Debido a esto, es posible escapar tantas líneas nuevas como desee, como en

// / / / / / Still a legal comment.

Las barras invertidas también se pueden usar al final de los comentarios regulares de una sola línea para hacer que continúen en la siguiente línea, como en

// Yet another comment / This line is in the comment // And so is this one!



// parece que sup y // parece inf . También podrían ser y , respectivamente.

No recuerdo haber visto estos en la segunda edición de K & R ni en ningún otro libro de C.