• C语言学习趣事_BT_C_Code_混乱编程代码分析_3


          好久没有看C的书籍了,前两天在CSDN求助,求各位大神们能介绍一本书,我求助的要求是这样的:求一本介绍Windows C语言运行时库的书籍。

    书的内容要求是:能够具体介绍C语言库函数的实现方法,例如printf这样的函数,或者fopen这样的函数是如何实现的。结果很多大侠没有明白我的意思,

    给我介绍的都是非常经典的书籍: 《Windows程序设计》、《Windows核心编程》这样的书籍,在此对那些回复的大侠表示感谢。 不知道园子里的大侠

    有没有人知道这方面的书籍,有的话请不吝指教,在此先谢过了。

        我前些天偶然看到了部分Windows下的C语言库函数的源代码,先贴出来一段printf的代码给大家看看,源代码的所有权归Microsoft所有,在此我仅仅是

    为了贴出来供大家鉴赏,看看原来printf函数可以有多简单。

    /***
    *printf.c - print formatted
    *
    *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
    *
    *Purpose:
    *       defines printf() - print formatted data
    *
    *******************************************************************************/
    
    #include <cruntime.h>
    #include <stdio.h>
    #include <dbgint.h>
    #include <stdarg.h>
    #include <file2.h>
    #include <internal.h>
    #include <mtdll.h>
    
    /***
    *int printf(format, ...) - print formatted data
    *
    *Purpose:
    *       Prints formatted data on stdout using the format string to
    *       format data and getting as many arguments as called for
    *       Uses temporary buffering to improve efficiency.
    *       _output does the real work here
    *
    *Entry:
    *       char *format - format string to control data format/number of arguments
    *       followed by list of arguments, number and type controlled by
    *       format string
    *
    *Exit:
    *       returns number of characters printed
    *
    *Exceptions:
    *
    *******************************************************************************/
    
    int __cdecl printf (
            const char *format,
            ...
            )
    /*
     * stdout 'PRINT', 'F'ormatted
     */
    {
            va_list arglist;
            int buffing;
            int retval;
    
            va_start(arglist, format);
    
            _ASSERTE(format != NULL);
    
            _lock_str2(1, stdout);
    
            buffing = _stbuf(stdout);
    
            retval = _output(stdout,format,arglist);
    
            _ftbuf(buffing, stdout);
    
            _unlock_str2(1, stdout);
    
            return(retval);
    }
    

         我第一次看Windows下微软的代码,不得不对微软的人说声:原来大神的人物就是这样的。首先这段代码非常精简,其次风格非常好,与我接下来

    要分析的一段代码简直就是天壤之别。我曾经在一段时间受Linux阵营的人的影响,一直觉得微软的Windows不好,甚至一度将windows从自己的计

    算机上卸载,后来因为各种原因又回来了(主要是Step 7/RSLogix等工控软件不支持Linux,现在我发现自己以前的看法绝对有失偏颇,现在想想其实

    微软对整个计算机的推动作用还是非常大的,好了这里不多说了。下面来看看今天的代码:

    int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
    o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
    

        这段代码的作用是输出: hello, world!

       分析代码还是按照原来的套路进行,第一步进行缩排,得到如下代码:

    int i;
    main()
    {
    	for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\o, world!\n",'/'/'/'))
    	 ;
    }
    read(j,i,p)
    {
    	write(j/p+p,i---j,i/i);
    }
    

       接下来补全部分代码定义,很显然上面的代码是按照K&R规范编制的,很多语法在ANSI C标准里面是不成立的。

    #include <stdio.h>
    
    int i;
    int main(int argc,char **argv)
    {
    	for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\o, world!\n",'/'/'/'))
    	 ;
    	 
    	 return 0;
    }
    int read(int j, int i, int p)
    {
    	write(j/p+p,i---j,i/i);
    }
    

      补全代码后这段代码需要说明的几个问题是:

       1、   i[str] 在解析的时候 ==>  str[i] ;  其中 str是一个字符串字面值。

       2、   字符串字面值实际返回的是一个指针, 即 “str” 的返回值类型是 char  *

       3、   '-'-'-'  这个表达式实际上==>    ( '-' ) -  ('-') ; 即表达是的返回值为 0 。

       4、   '/'/'/'  这个表达式实际上==>     ( '/' ) / ( '/' ) ; 即表达式的返回值是 1 。

       5、 最后一个需要说明的是write函数, 这个函数的用法我也不知道,但是可以google或者百度之,这里摘录一下百度百科的解释:

    int write(int handel, void *buf, int nbyte);
       handel 是文件描述符;
       buf是你指定的缓冲区,即指针,指向一段内存单元;
       nbyte是你要写入文件指定的字节数;
       返回值:写入文档的字节数(成功);-1(出错)
    

         这里就涉及到 stdout 的定义,这个宏定义的值是多大估计不需要再说了。还有就是按照unix处理设备的方式:一切皆文件。(没有人定义过,我自己的理解)。

    就和面向对象一样:一切皆对象。

         6、 这里还有一个需要说明的问题:

               i+++"hell\o, world!\n" 

      和  

               i---j;

          这个地方的解析牵扯到C语言编译解析过程的贪心法,具体的内容有兴趣的可以看看编译原理相关的书,我是不懂的,园子里脑袋大侠的文章写得不错,对编译

    器有深入的讨论,因此 +++ 和 ---在解析的时候会解释成(操作数++)+ 和 (操作数——)- 。

      对于第6个问题,在chinaunix论坛里面 pmerofc 大侠说这样的表达式不正确,我一直不明白,也不好意思请教, 原文的链接我忘记了,是一个女生自己写的博文,

    然后说这样有点问题,链接我也忘记了。不知道园子里的大侠能否解释一二。

       

         心里有点烦,非常的烦,写了这么多,为一些事情而烦恼......................

        曾经有人大代表说不支持农村孩子上大学,很多人反对,其实有些事情,还要辩证的看,我自己觉得就还是有点道理的(为了不被误会,说明一点我自己就是农村的)

    从我自己的经历来看,还是值得思考的问题。

       这里问个比较私人的问题: 不知道园子里garbageman大侠是否就是 chinaunix里面的pmerofc大侠,因为我搜索pmerofc大侠,看到他有文章链接是《C解毒》。

       如果是的话,请garbageMan大侠回复一句,在此先表示感谢。

        算了不说了, 准备睡觉........



  • 相关阅读:
    使用 virtualenv/venv 和 pip 管理虚拟环境
    Python:virtualenv 和 venv 的区别
    Python | Get unique values from a list
    Python ORM 框架 Peewee 知识点
    python之配置日志的几种方式
    python 中的 None,知识点
    Gunicorn 知识点
    gunicorn部署flask的log处理
    Python 逻辑运算符(and、or、not)、成员运算符(in、not in)、身份运算符(is、is not)
    Python 中没有 null,用 None 表示
  • 原文地址:https://www.cnblogs.com/volcanol/p/2215871.html
Copyright © 2020-2023  润新知