C / C ++中的嵌套注释

时间:2011-07-14 18:18:37

标签: c++ c comments

这是一个面试问题: -

  

编写一个C程序,在编译和运行时打印出一条消息   指示编译它的编译器是否允许/ * * /   评论巢。

此问题的解决方案如下: -

Sol: - 你可以有一个整数变量nest:

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

如果它支持嵌套注释,则答案为1,否则答案为0。

这是如何工作的?我不明白变量声明。

6 个答案:

答案 0 :(得分:22)

如果编译器不允许嵌套,则第一个*/将终止打开多行注释,这意味着0将不会被注释掉。用一些空格写的:

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

产生代码

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

如果它允许嵌套,它将是

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

导致

int nest = 1;

答案 1 :(得分:10)

“这是如何工作”的简短回答是:

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

嵌套注释就像:

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

没有,额外*使它成为:

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

0*1

或者,我认为这是正在发生的事情,但这个问题几乎是一场灾难。我完全赞同Blagovest Buyukliev的评论。

答案 2 :(得分:4)

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 :(得分:3)

如果它支持嵌套注释,那么你将(剥离注释):

int nest = 1;

如果没有,那么你将(剥离评论):

int nest = 0 * 1;

答案 4 :(得分:1)

这是一大堆令人厌恶的伤害。我的猜测是第三个/可能会取消第二个多行注释块,在零之后呈现*乘法,因此:

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

答案 5 :(得分:0)

如果编译器理解嵌套的注释,它将剥离/*/*/0*/**/部分并留下int nest = 1

否则,它会看到int nest = 0*10 * 1 == 0