¿Por qué este progtwig C comstack sin un error?

Soy un principiante en C, y estaba jugando con C. Escribí un código C como este:

#include  int main() { printf("hello world\n"); \ return 0; } 

Aunque utilicé \ sabiendas, el comstackdor de C no arroja ningún error. ¿Para qué se usa este símbolo en el lenguaje C?

Editar:

Incluso esto funciona:

 "\n"; 

La secuencia backslash-newline se elimina del código en una fase muy temprana (fase 2) del proceso de traducción. Solía ​​ser la forma en que creaba literales de cadena larga antes de que existiera la concatenación de cadena, y es así como aún se extienden las macros en varias líneas.

Consulte §5.1.1.2 Fases de traducción del estándar C99:

La precedencia entre las reglas de syntax de traducción se especifica en las siguientes fases. 5)

  1. Los caracteres multibyte del archivo de origen físico se asignan, de una manera definida por la implementación, al conjunto de caracteres de origen (introduciendo caracteres de nueva línea para los indicadores de fin de línea) si es necesario. Las secuencias de trígrafos se reemplazan por representaciones internas de un solo carácter correspondientes.
  2. Cada instancia de un carácter de barra invertida ( \ ) seguido inmediatamente por un carácter de nueva línea se elimina, uniendo las líneas de origen físicas para formar líneas de origen lógicas. Solo la última barra invertida en cualquier línea de fuente física será elegible para ser parte de tal empalme. Un archivo fuente que no esté vacío terminará en un carácter de nueva línea, que no irá precedido inmediatamente por un carácter de barra invertida antes de que se lleve a cabo dicho empalme.
  3. El archivo de origen se descompone en tokens de preprocesamiento 6) y secuencias de caracteres de espacios en blanco (incluidos los comentarios). Un archivo de origen no debe terminar en un token de preprocesamiento parcial o en un comentario parcial. Cada comentario es reemplazado por un carácter de espacio. Se conservan los caracteres de nueva línea. Si cada secuencia no vacía de caracteres de espacios en blanco que no sean de línea nueva se conserva o se reemplaza por un carácter de espacio se define por la implementación.
  4. Las directivas de preprocesamiento se ejecutan, las invocaciones de macros se expanden y se _Pragma expresiones de operador _Pragma unario. Si una secuencia de caracteres que coincide con la syntax de un nombre de carácter universal se produce mediante concatenación de token (6.10.3.3), el comportamiento no está definido. Una directiva #include preprocesamiento hace que el encabezado nombrado o el archivo fuente se procese de la fase 1 a la fase 4, recursivamente. Todas las directivas de preprocesamiento se eliminan.
  5. Cada miembro de conjunto de caracteres de origen y secuencia de escape en constantes de caracteres y cadenas literales se convierte en el miembro correspondiente del conjunto de caracteres de ejecución; Si no hay un miembro correspondiente, se convierte en un miembro definido de implementación distinto del carácter nulo (ancho). 7)
  6. Se concatenan tokens literales de cadena adyacente.
  7. Los caracteres de espacio en blanco que separan tokens ya no son significativos. Cada token de preprocesamiento se convierte en un token. Los tokens resultantes se analizan sintácticamente y semánticamente y se traducen como una unidad de traducción.
  8. Se resuelven todas las referencias externas de objetos y funciones. Los componentes de la biblioteca están vinculados para satisfacer referencias externas a funciones y objetos no definidos en la traducción actual. Toda la salida del traductor se recostack en una imagen de progtwig que contiene la información necesaria para la ejecución en su entorno de ejecución.

5) Las implementaciones se comportarán como si se produjeran estas fases separadas, aunque muchas de ellas se suelen plegar juntas en la práctica.

6) Como se describe en 6.4, el proceso de dividir los caracteres de un archivo fuente en tokens de preprocesamiento depende del contexto. Por ejemplo, vea el manejo de < dentro de una directiva de preprocesamiento #include .

7) Una implementación no necesita convertir todos los caracteres fuente no correspondientes al mismo carácter de ejecución.

Si tuviera un blanco o cualquier otro carácter después de su barra invertida, tendría un error de comstackción. Podemos decir que no tiene nada después porque no tiene un error de comstackción.


La otra parte de tu pregunta, acerca de:

 "\n"; 

es bastante diferente Es una expresión simple que no tiene efectos secundarios y, por lo tanto, no tiene efecto en el progtwig. El optimizador lo desechará completamente. Cuando escribes:

 i = 1; 

tienes una expresión con un valor que se descarta; se evalúa por su efecto secundario de modificar i .

A veces, encontrarás código como:

 *ptr++; 

El comstackdor le avisará que el resultado de la expresión se descarta; La expresión se puede simplificar a:

 ptr++; 

Y logrará el mismo efecto en el progtwig.

La \ , cuando es seguida inmediatamente por una nueva línea, es consumida por el preprocesamiento y hace que la siguiente línea “física” se una a la línea lógica actual. Esto es muy importante para escribir directivas de preprocesamiento largas, que deben estar todas en una línea lógica:

 #define SHORT very log macro \ consisting of lots and \ lots of preprocessor \ tokens 

Si elimina las secuencias de barra invertida-nueva línea, ya no es correcto. Algunos otros lenguajes de la cultura Unix tienen una syntax de continuación de línea de barra invertida similar: el lenguaje de shell POSIX derivado del shell Bourne, y también los archivos make.

 $ this is \ one shell command 

Acerca de "\n"; , que es una expresión primaria utilizada para formar una expresión-statement. En C, las expresiones se pueden usar como declaraciones, y esto se explota todo el tiempo. Su llamada a printf , por ejemplo, es una statement de expresión. printf("hello world\n") es una expresión postfix que llama a una función, obteniendo un valor de retorno. Debido a que usó esta expresión como una statement, el valor de retorno se descarta. El valor de retorno de printf indica cuántos caracteres se imprimieron, o si fue exitoso en absoluto, por lo que al tirarlo, su progtwig deja de lado si la llamada a printf realmente funcionó.

Dado que el valor de una expresión-expresión se descarta, si tal statement tampoco tiene efectos secundarios, es una statement inútil que no hace nada (como su "\n" ). Pero tales declaraciones de expresiones inútiles no son erróneas. Si agrega opciones de advertencia a la línea de comando de su comstackdor, podría recibir una advertencia como “statement sin efecto” o algo así.

La barra invertida \ se interpreta por el preprocesador C. Protege su siguiente carácter (el nuevo carácter de línea en su caso).

La barra invertida simplemente está escapando del siguiente carácter. En este caso, probablemente un carácter de final de línea (CR). Perfectamente razonable

La barra invertida más lo que lo sigue es una secuencia de escape ; “\ n” junto es el carácter de nueva línea (imprime una nueva línea). Otro importante es “\ t”, para la pestaña.