una txt texto por plano matriz linea libreria leer guardar desde datos crear como buscar archivos archivo c++ c parsing standards grammar

txt - ¿Cómo leer y entender los estándares de C & C++ y la gramática de lenguaje utilizada en ellos?



leer datos de un archivo.txt en c++ (3)

A menudo encuentro que los Estándares C y C ++ son difíciles de leer y entender, incluso las oraciones simples en inglés y sus expresiones dan una experiencia terrible. En la parte superior, la gramática del lenguaje es totalmente infernal. Estoy seguro de que muchos comparten el mismo sentimiento, al menos mis amigos lo hacen.

Me gustaría entenderlo por algunos ejemplos. Comencemos con esto (que trata de explicar por qué the conditional expression in C++ es diferente de the conditional expression in C : (citado de wikipedia )

La vinculación de los operadores en C y C ++ se especifica (en los estándares correspondientes) mediante una gramática de lenguaje factorizado, en lugar de una tabla de precedencia. Esto crea algunos conflictos sutiles. Por ejemplo, en C, la sintaxis para una expresión condicional es:

¿lógica-O-expresión? expresión: expresión condicional

mientras que en C ++ es:

¿lógica-O-expresión? expresión: expresión-asignación

Por lo tanto, la expresión:

e = a <d? a ++: a = d

se analiza de manera diferente en los dos idiomas. En C, esta expresión es un error de sintaxis, pero muchos compiladores lo analizan como:

e = ((a <d? a ++: a) = d)

que es un error semántico, ya que el resultado de la expresión condicional (que podría ser un ++) no es un valor l. En C ++, se analiza como:

e = (a <d? a ++: (a = d))

que es una expresión válida.

¡Por favor, alguien explique el texto en negrita en la cita anterior! Por favor, explica la gramática con algunos ejemplos más (especialmente aquellos en los que C y C ++ difieren).

EDITAR: solo quiero saber cómo leerlos y entenderlos. Quiero decir, si tuviera que explicar eso en inglés hablado, ¿cómo lo haría?


Aquí hay una descripción de la gramática C ++ para expresiones , que define la expresión de asignación como

assignment-expression: conditional-expression unary-expression assignment-operator assignment-expression

En lenguaje simple, una expresión de asignación puede ser una expresión condicional O una expresión unaria, seguida de un operador de asignación, seguido de una expresión de asignación. Entonces, su próxima pregunta es ''¿Qué es una expresión condicional'' y usted consulta esa parte de la gramática, y continúa hasta llegar al fondo!

Entonces en C ++ puedes ver que el operador al que te refieres puede tomar una ''expresión condicional'' como en C, pero también una asignación

Entonces con su sombrero ''C'', mira la parte final del operador como una tarea, que la sintaxis C no debería permitir. En cambio, parecería que algunos compiladores analizan la parte final del operador de forma simple para dar

e = (a < d ? a++ : a) = d

Pero en C ++, es válido encontrar una tarea allí, por lo que a = d se acepta en su totalidad como la expresión final, por lo que obtienes

e = (a < d ? a++ : (a = d))


Básicamente, cosas como:

assignment-expression: conditional-expression unary-expression assignment-operator assignment-expression

(como se menciona en algunas otras respuestas aquí) son reglas usadas para describir la "gramática" de C (o C ++) válido. Estas reglas anotadas también se adhieren a cierta gramática, por lo que le sugiero que aprenda esa gramática, para que pueda leer y comprender las reglas.

Para empezar, podrías estudiar, por ejemplo, el formulario Backus-Naur , si aún no lo sabes. (Mi enlace va al artículo de Wikipedia sobre este tema.) Si bien el estándar de C ++ no utiliza el formulario Backus-Naur (IIRC), es lo suficientemente similar como para comenzar.


Tienes que referirte a lo que es una expresión de asignación . Se define en el estándar C ++ 03 en 5.17 / 1 [expr.ass]:

assignment-expression: conditional-expression logical-or-expression assignment-operator assignment-expression throw-expression assignment-operator: one of = *= /= %= += -= >>= <<= &= ˆ= |=

Lo que dice es que una expresión de asignación puede ser:

  • Una expresión condicional
  • Una expresión lógica seguida de un operador de asignación seguido de una expresión de asignación
  • Una expresión de lanzamiento .

No cito la definición de gramática de todo porque sería bastante grande (sobre todo porque la expresión de condición abarca muchas cosas).

Entonces, lo primero que vemos es que una expresión de asignación puede ser una expresión condicional, por lo que tenemos la sintaxis C cubierta. Lo que el estándar C ++ agrega es que el lado derecho de : también puede ser algo que contenga un operador de asignación o un lanzamiento .

El ejemplo proporcionado es bueno: e = a < d ? a++ : a = d e = a < d ? a++ : a = d .

Aquí, el lado derecho de : es una expresión o lógica ( a , porque la expresión unaria se incluye en la expresión lógica o expresión ), seguida de un operador de asignación ( = ), seguido de una expresión de asignación ( d , porque la expresión unaria se incluye en la expresión de asignación ).