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

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

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

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

Sol: - вы можете иметь целочисленную переменную nest:

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

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

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

6 ответов


если компилятор не разрешает вложенность, первый */ завершит открытие многострочного комментария, что означает 0 не будет закомментирован. Написано с некоторыми пробелами:

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

в результате в коде

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

если это позволяет вложенность, это будет

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

в результате

int nest = 1;

короткий ответ на вопрос "как это работает" таков:

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

с вложенными комментариями становится что-то вроде:

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

и без лишних * делает это:

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

или 0*1.

или, я думаю, что это происходит, но этот вопрос в значительной степени кошмаром. Я полностью согласен с комментарием Благовест Buyukliev по.


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

вложенность не допускается

если вложенность не разрешена, диапазон первого комментария:

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

с удаленным комментарием (пробел, оставленный для читаемости-препроцессор C++ заменяет одно пространство, не уверен в C), следующий комментарий:

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

С этим также удаляется:

int nest =      0*    1;

вложенности допускается

ниже |+- строка показывает область внешнего комментария и vvvvvv указывает на тех. объем внутреннего комментария.

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

С этими комментариями удалено:

int nest =            1;

если он поддерживает вложенные комментарии, то у вас будет (зачистка комментариев):

int nest = 1;

Если это не так, то у вас будет (зачистка комментариев):

int nest = 0 * 1;

это большой мешок отвратительной боли. Я предполагаю, что третий / возможно, отменяет второй многострочный блок комментариев, отображая * после нуля умножение, следовательно:

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

если компилятор понимает вложенные комментарии, он просто удалит /*/*/0*/**/ часть и оставить вас с int nest = 1.

в противном случае, он будет видеть int nest = 0*1 и 0 * 1 == 0.