• 測试编译器是否同意凝视嵌套的程序


    问题:某些C编译器同意嵌套凝视。请写一个測试程序,要求:不管是

    对同意嵌套凝视的编译器,还是对不同意嵌套凝视的编译器,该程序都

    能正常通过编译(无错误消息出现), 可是这两种情况下程序运行的结果

    却不同样。

     提示: 在用双引號括起的字符串中, 凝视符 /* 属于字符串的一部分,而

    在凝视中出现的双引號“ ”又属于凝视的一部分。

                                               出至——《C陷阱与缺陷》练习1-1

    解答:

     假设仅仅是測试编译器是否同意凝视嵌套,那么由提示非常easy写出程序:

    程序一:

    #include<iostream>

    int main()
    {

     std::cout << /* " /*  */ " */    “*/" << std::endl;

     return 0;

    }

    假设编译器同意凝视嵌套,那么程序会编译成功,程序运行结果为: */

    字符串“*/"前面的部分/* ”/* */“ */会直接被其最外层的凝视对给凝视掉。

    假设编译器不同意凝视嵌套,那么程序编译时时会报错,由于

    /* ”/* */” */  ” */“会变成 字符串"*/"和 */“,编译器无法识别*/”,所以会报错。

    假设将程序写成这样:

    程序二:

    #include<stdio.h>

    int main()

    {

     std::cout << /* " /* */ " */ " <<std::endl;

     return 0;

    }

    假设编译器同意凝视嵌套,那么程序会在编译时报错,由于此时

    /* " /* */ " */ " 会变成 ",编译器无法识别。

    假设编译器不同意凝视嵌套,那么程序会编译成功,程序执行结果为:*/

    第一个/*会与遇到的第一个*/形成凝视对,将两者之间的内容 "/*凝视掉,

    仅仅留下字符串"*/"


    程序一与程序二都无法满足同一时候通过两种编译器的条件,究其原因,是由于

    /*与*/或者遵循就近匹配,此时编译器支持凝视嵌套,或者遵循优先匹配,此时

    */与最须要匹配的/*进行匹配,此时编译器不支持凝视嵌套。并且双引號"与"遵循

    就近匹配原则。这就导致当程序通过一个编译器时,就无法通过还有一个编译器,

    总是会在程序无法通过编译器时产生符号冗余。

     所以最根本的问题就是想办法消除程序中的符号冗余,想了好几种方法,都未成功,

    最后想到用数学中的对称思维,既然一个这种式子产生一个符号冗余,那再加入一个

    式子,产生还有一个符号冗余,两个冗余的符号组合在一起,就会形成一个新的凝视对

    或者一个字符串,这样就能够使得程序同一时候通过两种编译器。

    程序例如以下:

    程序三:

    #include<stdio.h>

    int main()

    {

     std::cout <<  /* " /* " */ " */ " /* " /* " */ " */ "<< std::endl;

     return 0;

    }

    假设编译器不支持凝视嵌套,输出结果为:

      */ */

    /* " /* " */ " */ " /* " /* " */ " */ "会变成:“*/” “*/”,画底线部分会被凝视掉。

    假设编译器支持凝视嵌套,输出结果为:

     /* " /* " */ " */

    /* " /* " */ " */ " /* " /* " */ " */ "会变成:" /* " /* " */ " */ ",画底线部分会被凝视掉。




  • 相关阅读:
    第15届创新英语大赛初赛第二阶段题目
    13.递归第一次
    13.递归第一次
    13.递归第一次
    13.递归第一次
    Algs4-1.3.19给出一段代码,删除链表的尾结点
    Algs4-1.3.18下面链表在代码的作用
    Algs4-1.3.17从文件中读取信息生成Transaction对象数组
    Algs4-1.3.16从文件中读取日期生成日期对象数组
    Algs4-1.3.15打印Queue中倒数第k个元素的值
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4377526.html
Copyright © 2020-2023  润新知