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.
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 como0*1
, sino más bien como un comentario. Con o sin anidamiento, el compilador debería ver esto como0*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.
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
.
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