飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7611|回复: 7

[C/C++] 一段烂代码,看不懂的进

  [复制链接]

该用户从未签到

发表于 2010-11-4 18:07:22 | 显示全部楼层 |阅读模式
#include <stdio.h>

int mystrlen(char * str)
{
        if(!*str)return 0;
        else return mystrlen(++str)+1;
}

main()
{
        char a[2];
        int (*myprint)(char *,... ) = printf;
        char * str = "%d\n";
        a[0] = 0;
        a[1] = 0;
        scanf("%d",(char *)a);
        (* myprint)(str,*(int *)a);
        (* myprint)(str,mystrlen("Hello,Nisy!"));
}


哎  连1+1 都看不懂 ……
PYG19周年生日快乐!

该用户从未签到

发表于 2010-11-4 18:31:54 | 显示全部楼层
递归一直找到/0
不过效率低,递归进栈消耗时间、空间也消耗
时间复杂度、空间复杂度都高....
还不容顺序查找呢...
PYG19周年生日快乐!

该用户从未签到

发表于 2010-11-5 00:30:58 | 显示全部楼层
还真的看不懂,努力
PYG19周年生日快乐!

该用户从未签到

发表于 2010-11-5 10:16:14 | 显示全部楼层
本帖最后由 hnynes 于 2010-11-5 10:18 编辑

这段代码,第一点看那个
int mystrlen(char * str)
{
        if(!*str)return 0;
        else return mystrlen(++str)+1;
}

这种写法效率太低,对于字符串的长度,这个确实是没有什么好办法,一般来讲无法测试长度的就,直接让调用者给个长度吧,这个并没有什么问题的。很容易的。
这个方法既然参数已经定义为了char *,就没有必要再去逐个字节地计算长度,直接一个strlen就可以了。没有必要弄得那么复杂,要不然,你就将参数改为void * 喽。
另外一点,这个也不见得支持什么非char *的类型,因为在强转为int *后,很有可能会使串中的某个字节为\0,所以这种写法在某种程序上来讲,还有错误。既然是对字符串的,直接使用strlen或者字节检查就行,递归效率太低。
int mystrlen(char * str)
{
    int length = 0;
    while (!str)
    {
        ++length;
    }
    return length;
或者直接用
    int length = 0;
    if (str)
    {
        length = strlen(str);
    }
    return length;
}

再看下面的
main()
{
        char a[2];
        int (*myprint)(char *,... ) = printf;
        char * str = "%d\n";
        a[0] = 0;
        a[1] = 0;
        scanf("%d",(char *)a);
        (* myprint)(str,*(int *)a);
        (* myprint)(str,mystrlen("Hello,Nisy!"));
}

第二点呢,这个里面完全是闹眼子。
int (*myprint)(char *,... ) = printf;
定义一个这种指针纯属多余。
简单的写法就可以完成的事情,弄得那么复杂不知何用意。

main()
{
        char a[4] = "";
        char * str = "%d\n";
        scanf("%d",(int *)a);
        printf(str, *(int *) a);
        printf(str, mystrlen("Hello,Nisy!"));
}
上面我还改了a串的长度,因为在32位机上,整型数是4字节的,如果只给两个字节,会溢出。再或者你可以使用short。

当然我并不想否定这段代码的原作者的思想,只是简单的东西,就应该用最简单的办法去实现,编程开发更多的思想层面的东西,而不是技巧上的滥用,代码是写给机器看的,但同时也是给你看的。
PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2017-1-19 11:18
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2010-11-5 14:13:56 | 显示全部楼层
    输出0,和“HELLO,NISY!”字符长度、(*myprint)(char *,... )就是 printf("%d\n",...)。N大给重定义了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-11-5 22:13:55 | 显示全部楼层
    本帖最后由 yyj4968 于 2010-11-5 22:15 编辑

    #include <stdio.h>

    int mystrlen(char * str)         //递归求字符串长度
    {
            if(!*str)return 0;          //若遇到 "\0" 长度为空
            else return mystrlen(++str)+1;  
    }

    main()
    {
            char a[2];
            int (*myprint)(char *,... ) = printf;              //定义一个函数指针指向printf函数
            char * str = "%d\n";                               // 定义一个格式控制字符串指针
            a[0] = 0;
            a[1] = 0;
            scanf("%d",(char *)a);                     //输入字符串
            (* myprint)(str,*(int *)a);                //相当于printf("%d\n",*(int *)a)
            (* myprint)(str,mystrlen("Hello,Nisy!"));   //同上
    }
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-11-5 22:21:04 | 显示全部楼层
    果然看不懂!太牛了!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-11-6 10:43:57 | 显示全部楼层
    回复 4# hnynes

        牛人~~~
        这段代码是不能用在实际的工程下·~但是要是学习的话,这样能很好理解内存模型~~哈哈~~只是理解语言的精髓,不用这样吧~~/:018
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表