Подтвердить что ты не робот

Вложенные комментарии в C/С++

Это вопрос интервью: -

Напишите программу C, которая при компиляции и запуске выводит сообщение указывая, компилируется ли компилятор с помощью /* */ комментарии к гнезду.

Решение этой проблемы приведено ниже: -

Sol: - вы можете иметь целочисленное переменное гнездо:

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

если он поддерживает вложенные комментарии, тогда ответ 1 else отвечает 0.

Как это работает? Я не понимаю объявление переменной.

4b9b3361

Ответ 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.