zoukankan      html  css  js  c++  java
  • C编译器的注释嵌套

    本博客详细解释:《C陷阱与缺陷》课后习题1-1,题目:

         某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译,但是这两种情况下程序执行的结果却不同。

    首先,要说明的是C90只有一种注释风格,就是使用“/*”和“*/”,是没有//注释符号的。在预处理阶段,C预处理器会剔除所有出现在“/*”和“*/”之间的内容(包括这对记号本身),所以在接下来传送到C编译器的代码文件里是不会出现任何注释内容的。

    下面说明什么是嵌套注释:
    什么是注释呢?注释就是写什么东西都无所谓,反正编译器不会看到这些东西。很不幸,C预处理器一般都不支持嵌套注释,如果你这样写:

           /*one /* two */*/

     是行不通的。因为预处理器在碰到第一个“*/”时就认为注释已经结束!于是它把到这里为止的注释移除,可想而知,结果留下孤零零一个“*/”—编译程序又报错了。

    但是,同样一段代码,对于支持嵌套注释的的编译器而言,结果为都注释掉。因为在two前面的/*会先匹配two后面的*/,one前面的/*匹配最后的*/(目测它与if,else语句的嵌套一样,就近原则)

    好了,知道了什么是嵌套注释,让我们通过一个例子来继续深入的理解嵌套注释:

        /*/**/ "*/"/*" /**/

    对于不支持嵌套注释的编译器而言:会将该代码分为/*/**/,  "*/",  /**/三个部分,最后的结果是"*/";

    对于支持嵌套注释的编译器而言:会将该代码分为/*/**/"*/,  "/*",  /**/三个部分,最后结果是"/*"。

     

    对于习题1-1,我们可以通过下面的代码来检测编译器是否支持嵌套注释,具体代目如下:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int main() {
        int ans = /*/*/0*/**/1;
        printf("%d\n", ans);
    
        return 0;
    }
    /*/*/0*/**/1为 Doug McIlroy 发现,若编译器支持嵌套注释,则ans = 1;否则为0

    参考博客:http://www.cppblog.com/Tim/archive/2011/03/25/142726.html

                   http://hi.baidu.com/iexinyu/item/27dfdbd313f287392a35c77f

     

     

  • 相关阅读:
    C#限速下载网络文件
    MVC与WebApi中的异常统一处理
    Javascript闭包(Closure)
    HTML转义字符 Unicode和CSS伪类介绍
    .NET通用工具——正则表达式
    C#的格式化(进制转换|位运算)
    javascript中的类型转换(进制转换|位运算)
    MVC中的七层架构
    Excel中的常用功能
    jQuery基础
  • 原文地址:https://www.cnblogs.com/liuxiaoming/p/2636831.html
Copyright © 2011-2022 走看看