august 发表于 2007-10-5 17:08:08

程序C

#define N 4
#include "stdio.h"
static struct man
{
    char name;
    int age;
} person={"li",18,"wang",19,"zhang",20,"sun",22};
main()
{
    struct man *q,*p;
    int i,m=0;
    p=person;
    for (i=0;i<N;i++)
   {
      if(m<p->age)
      q=p++;
      m=q->age;
    }
   printf("%s,%d",(*q).name,(*q).age);
}

请问这程序有什么问题吗?偶看不出哪里有问题.....

rednaxela 发表于 2007-10-5 17:35:11

单就运行结果来说没什么问题吧,编译可以通过,运行的结果是
sun,22

不过值得吐槽的地方不是一般的多...||

C:\\>cl /Wall zzc.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation.All rights reserved.

zzc.c
D:\\Program Files\\Microsoft Visual Studio 8\\VC\\include\\stdio.h(360) : warning C4255: '_get_printf_count_output' : no function prototype given: converting '()' to '(void)'
zzc.c(14) : warning C4255: 'main' : no function prototype given: converting '()' to '(void)'
zzc.c(15) : warning C4431: missing type specifier - int assumed. Note: C no longer supports default-int
c:\\zzc.c(23) : warning C4701: potentially uninitialized local variable 'q' used
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.All rights reserved.

/out:zzc.exe
zzc.obj

lw 发表于 2007-10-5 18:57:49

理论上正确的写法应该是:
{
   {"li",18,},
   {"wang",19,},
   {"zhang",20,},
   {"sun",22},
};
当然某些逗号可省略
不过既然是指定了大小,而且C规定数组的连续性,自然没有问题

shawind 发表于 2007-10-5 19:27:29


D:\\test>dmc t.c
link t,,,user32+kernel32/noi;

D:\\test>t
sun,22

no error & no warning

rednaxela 发表于 2007-10-5 19:47:19

恩.除了编译警告和lw提到的之外,还有不少...
<stdio.h>
然后那个*q没有任何实际作用,完全可以只用*p去满足使用需求
混在一起写的声明和初始化从来都不是被推荐的...没人会因为这样少写几行代码而被认为更强,因为实际的有效代码行数还是一样.

rednaxela 发表于 2007-10-5 19:53:28

shawind没把警告级别全打开...我那是用了/Wall的

lw 发表于 2007-10-5 22:02:36

偶随便也喜欢随手写声明,但是有时候太懒用一堆大括号啊……
{
   int i;
   for( ;i; ... ) {}
}
偶倒是宁可写在一起了……相对更喜欢拆开函数这种……
不过这些都只是个人STYLE的问题巴……管不了别人嘛

silekey 发表于 2007-10-5 22:16:41

随便说说:

static struct man // static不明其用处
      if(m<p->age) // 此行多余
      q=p++;         //此行导致第一项重复打印,并且最后项没有打印出来

printf("%s,%d",(*q).name,(*q).age); //此行没有放在循环体内吧,这个错误加上上面的错误,导致最终结果打印的是最后一项数据?

silekey 发表于 2007-10-5 22:20:35

不过代码格式也是个问题,楼主可以用源代码格式化工具整理一下,就知道格式化后的代码看起来是比较舒服的。

rednaxela 发表于 2007-10-5 22:25:53

引用第7楼silekey于2007-10-05 22:16发表的:
随便说说:

static struct man // static不明其用处
      if(m<p->age) // 此行多余
      q=p++;         //此行导致第一项重复打印,并且最后项没有打印出来
.......
LZ想要输出的不就是年龄最大的那个entry么...? 至少代码上是这么写的,结果也是对的
页: [1] 2
查看完整版本: 程序C