Comentarios anidados en C/C++

2 minutos de lectura

Avatar de usuario de Pritpal
Pritpal

Esta es una pregunta de la entrevista: –

Escriba un programa en C que, cuando se compile y ejecute, imprima un mensaje que indique si el compilador con el que se compila permite anidar comentarios /* */.

La solución a este problema se da a continuación: –

Sol: – puede tener un nido de variables enteras:

int nest = /*/*/0*/**/1;

si admite comentarios anidados, la respuesta es 1; de lo contrario, la respuesta es 0.

¿Cómo funciona esto? No entiendo la declaración de variables.

  • Otra agradable pieza de código es strlen(/*/*/"*/*/"/*"/**/). Este es un buen ejercicio para sitios como Code Golf, pero muy inapropiado como pregunta de entrevista.

    – Przemek

    21 oct 2020 a las 18:38

Avatar de usuario de Femaref
Femaref

Si el compilador no permite el anidamiento, el primero */ terminará la apertura del comentario de varias líneas, lo que significa que el 0 no será comentado. Escrito con algunos espacios:

int nest = /*/*/ 0 * /**/ 1;

dando como resultado el código

int nest = 0 * 1; // -> 0

Si permite anidar, será

int nest = /*/*/0*/**/ 1;

Resultando en

int nest = 1;

  • No es necesariamente el último */ en el archivo que lo terminaría si admitiera el anidamiento. Si ese fuera el caso entonces /**/0*1/**/ no se registraría como 0*1, sino más bien como un comentario. Con o sin anidamiento, el compilador debería ver esto como 0*1

    – redbmk

    14 de julio de 2011 a las 19:17

  • Curiosamente, debido a que el resaltador de sintaxis SO no admite el anidamiento, el resaltado en el ejemplo final sugiere la semántica del primer ejemplo ^_^

    – Carreras de ligereza en órbita

    28 de febrero de 2018 a las 11:45


La respuesta corta a “¿cómo funciona esto?” es que:

int nest = /*/*/0*/**/1;

con comentarios anidados se convierte en algo como:

int nest = 
// /* (comment level 1) 
//    /*/ (comment level 2) 
//         0
//    */*
// */
1;

y sin, el extra * lo hace:

int nest = 
// /*/ (comment level 1) 
// */
        0
    *
// /*
// */
1;

o 0*1.

O creo que eso es lo que está pasando, pero esta pregunta es prácticamente un desastre. Estoy totalmente de acuerdo con el comentario de Blagovest Buyukliev.

int nest = /*/*/0*/**/1;

Anidamiento no permitido

Si NO se permite anidar, el rango del primer comentario es:

           vvvvv
int nest = /*/*/0*/**/1;

Con ese comentario eliminado (se deja un espacio para la legibilidad: el preprocesador de C ++ sustituye un solo espacio, no estoy seguro acerca de C), el siguiente comentario que se ve es:

                  vvvv
int nest =      0*/**/1;

Con eso también eliminado:

int nest =      0*    1;

Anidamiento permitido

Bajo el |+- línea muestra el alcance del comentario externo, y vvvvvv indica el alcance del comentario interno.

           +---------+
           |         |
           | vvvvvv  |
int nest = /*/*/0*/**/1;

Con esos comentarios eliminados:

int nest =            1;

Si admite comentarios anidados, tendrá (eliminar los comentarios):

int nest = 1;

Si no es así, entonces tendrás (eliminando los comentarios):

int nest = 0 * 1;

Esa es una gran bolsa de dolor repugnante. Supongo que el tercero / posiblemente cancela el segundo bloque de comentarios de varias líneas, haciendo que el * después del cero una multiplicación, por lo tanto:

/* */0 * /* */ 1 == 0 * 1 == 0 // ==> nested comments aren't supported.

Avatar de usuario de RocketR
CoheteR

Si el compilador entiende los comentarios anidados, simplemente eliminará el /*/*/0*/**/ parte y te dejo con el int nest = 1.

De lo contrario, se verá int nest = 0*1 y 0 * 1 == 0.

¿Ha sido útil esta solución?