在读《c陷阱与缺陷》这本书时,在第一章就遇到了一个看似简单的问题:
某些C编译器允许嵌套注释,形如 :
/* /* 注释部分 */ */
而另一部分编译器不允许,上边的代码将会被理解为:*/ , 即一个注释结束符。
/* /* 注释部分 */ */
现在要求写一段带有上述结构的测试程序,能正常通过两种不同类型编译器(不报错),但是执行结果不同。
提示:双引号中的 /* 属于字符串的一部分,而注释中的双引号“”又属于注释的一部分。
Doug Mcllroy的解法
/*/*/0*/**/1
对此表达式求值即可。
如果编译器允许嵌套注释,则上式被解释为:
/* /* /0 */ * */1
两个始符注释开恰好被两个结束符匹配,所以上式的值就是1。
如果不允许嵌套注释,则上式被解释为: