Вложенные комментарии в C / C ++ - PullRequest
14 голосов
/ 14 июля 2011

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

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

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

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

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

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

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

Ответы [ 6 ]

22 голосов
/ 14 июля 2011

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

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

, что приводит к коду

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

Если разрешить вложение, оно будет

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

, что приведет к

int nest = 1;
10 голосов
/ 14 июля 2011

Короткий ответ на вопрос «как это работает» таков:

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

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

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

и без, дополнительный * делает это:

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

или 0*1.

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

4 голосов
/ 15 июля 2011
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;
3 голосов
/ 14 июля 2011

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

int nest = 1;

Если этого не произойдет, то у вас будет (Снятие комментариев):

int nest = 0 * 1;
1 голос
/ 14 июля 2011

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

/* */0 * /* */ 1 == 0 * 1 == 0 // ==> nested comments aren't supported.
0 голосов
/ 14 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...