这是一个面试问题: -
编写一个C程序,在编译和运行时打印出一条消息 指示编译它的编译器是否允许/ * * / 评论巢。
此问题的解决方案如下: -
Sol: - 你可以有一个整数变量nest:
int nest = /*/*/0*/**/1;
如果它支持嵌套注释,则答案为1,否则答案为0。
这是如何工作的?我不明白变量声明。
答案 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*1
和0 * 1 == 0
。