Nisy 发表于 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;
      int (*myprint)(char *,... ) = printf;
      char * str = "%d\n";
      a = 0;
      a = 0;
      scanf("%d",(char *)a);
      (* myprint)(str,*(int *)a);
      (* myprint)(str,mystrlen("Hello,Nisy!"));
}


哎连1+1 都看不懂 ……

sniy 发表于 2010-11-4 18:31:54

递归一直找到/0
不过效率低,递归进栈消耗时间、空间也消耗
时间复杂度、空间复杂度都高....
还不容顺序查找呢...

tmbs 发表于 2010-11-5 00:30:58

还真的看不懂,努力

hnynes 发表于 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;
      int (*myprint)(char *,... ) = printf;
      char * str = "%d\n";
      a = 0;
      a = 0;
      scanf("%d",(char *)a);
      (* myprint)(str,*(int *)a);
      (* myprint)(str,mystrlen("Hello,Nisy!"));
}

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

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

当然我并不想否定这段代码的原作者的思想,只是简单的东西,就应该用最简单的办法去实现,编程开发更多的思想层面的东西,而不是技巧上的滥用,代码是写给机器看的,但同时也是给你看的。

komany 发表于 2010-11-5 14:13:56

输出0,和“HELLO,NISY!”字符长度、(*myprint)(char *,... )就是 printf("%d\n",...)。N大给重定义了。

yyj4968 发表于 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;
      int (*myprint)(char *,... ) = printf;            //定义一个函数指针指向printf函数
      char * str = "%d\n";                               // 定义一个格式控制字符串指针
      a = 0;
      a = 0;
      scanf("%d",(char *)a);                     //输入字符串
      (* myprint)(str,*(int *)a);                //相当于printf("%d\n",*(int *)a)
      (* myprint)(str,mystrlen("Hello,Nisy!"));   //同上
}

whypro 发表于 2010-11-5 22:21:04

果然看不懂!太牛了!

popo2008 发表于 2010-11-6 10:43:57

回复 4# hnynes

    牛人~~~
    这段代码是不能用在实际的工程下·~但是要是学习的话,这样能很好理解内存模型~~哈哈~~只是理解语言的精髓,不用这样吧~~/:018
页: [1]
查看完整版本: 一段烂代码,看不懂的进