Вложенные комментарии в C/С++
Это вопрос интервью: -
Напишите программу C, которая при компиляции и запуске выводит сообщение указывая, компилируется ли компилятор с помощью /* */ комментарии к гнезду.
Решение этой проблемы приведено ниже: -
Sol: - вы можете иметь целочисленное переменное гнездо:
int nest = /*/*/0*/**/1;
если он поддерживает вложенные комментарии, тогда ответ 1 else отвечает 0.
Как это работает? Я не понимаю объявление переменной.
Ответы
Ответ 1
Если компилятор не разрешает вложенность, первый */
завершает открытие многострочного комментария, то есть 0
не будет закомментирован. Написано с некоторыми пробелами:
int nest = /*/*/ 0 * /**/ 1;
в результате чего код
int nest = 0 * 1; // -> 0
Если он позволяет вложенность, он будет
int nest = /*/*/0*/**/ 1;
в результате чего
int nest = 1;
Ответ 2
Краткий ответ на вопрос "как это работает":
int nest = /*/*/0*/**/1;
с вложенными комментариями становится примерно следующим:
int nest =
// /* (comment level 1)
// /*/ (comment level 2)
// 0
// */*
// */
1;
и без, дополнительный * делает это:
int nest =
// /*/ (comment level 1)
// */
0
*
// /*
// */
1;
или 0*1
.
Или, я думаю, что происходит, но этот вопрос в значительной степени является катастрофой. Я полностью согласен с комментарием Благовеста Буюклиева.
Ответ 3
Если он поддерживает вложенные комментарии, у вас будет (снятие комментариев):
int nest = 1;
Если это не так, тогда у вас будет (снятие комментариев):
int nest = 0 * 1;
Ответ 4
int nest = /*/*/0*/**/1;
Вложенность не допускается
Если вложенность НЕ допускается, первый диапазон комментариев:
vvvvv
int nest = /*/*/0*/**/1;
С удаленным комментарием (пробел остается читабельным - препроцессор С++ заменяет одно пространство, не уверенное в C), следующий комментарий выглядит следующим образом:
vvvv
int nest = 0*/**/1;
С этим удаляется также:
int nest = 0* 1;
Разрешено вложение
Ниже строка |+-
отображает область внешнего комментария, а vvvvvv
указывает область видимости внутреннего комментария.
+---------+
| |
| vvvvvv |
int nest = /*/*/0*/**/1;
С удаленными комментариями:
int nest = 1;
Ответ 5
Это большой мешок отвратительной боли. Я предполагаю, что третий /
, возможно, отменяет второй многострочный блок комментариев, отображая *
после нулевого умножения, следовательно:
/* */0 * /* */ 1 == 0 * 1 == 0 // ==> nested comments aren't supported.
Ответ 6
Если компилятор понимает вложенные комментарии, он просто разделит часть /*/*/0*/**/
и оставит вас с int nest = 1
.
В противном случае он увидит int nest = 0*1
и 0 * 1 == 0
.