幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4128|回复: 19

[通用编程] 程序C

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-10-5 17:08:08 | 显示全部楼层 |阅读模式
#define N 4
#include "stdio.h"
static struct man
{
    char name[20];
    int age;
} person[N]={"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);
}

请问这程序有什么问题吗?偶看不出哪里有问题.....[s:6][s:6]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 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
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-10-5 18:57:49 | 显示全部楼层
理论上正确的写法应该是:
{
   {"li",18,},
   {"wang",19,},
   {"zhang",20,},
   {"sun",22},
};
当然某些逗号可省略
不过既然是指定了大小,而且C规定数组的连续性,自然没有问题
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2007-10-5 19:27:29 | 显示全部楼层
  1. D:\\test>dmc t.c
  2. link t,,,user32+kernel32/noi;
  3. D:\\test>t
  4. sun,22
复制代码
no error & no warning [s:5]
え~え~お!!!
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-10-5 19:47:19 | 显示全部楼层
恩.除了编译警告和lw提到的之外,还有不少...
<stdio.h>
然后那个*q没有任何实际作用,完全可以只用*p去满足使用需求
混在一起写的声明和初始化从来都不是被推荐的...没人会因为这样少写几行代码而被认为更强,因为实际的有效代码行数还是一样.
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-10-5 19:53:28 | 显示全部楼层
shawind没把警告级别全打开...我那是用了/Wall的
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-10-5 22:02:36 | 显示全部楼层
偶随便也喜欢随手写声明,但是有时候太懒用一堆大括号啊……
{
   int i;
   for( ;i; ... ) {}
}
偶倒是宁可写在一起了……相对更喜欢拆开函数这种……
不过这些都只是个人STYLE的问题巴……管不了别人嘛
Style-C
回复 支持 反对

使用道具 举报

2

主题

26

帖子

288

积分

③业余

积分
288
QQ
发表于 2007-10-5 22:16:41 | 显示全部楼层
随便说说:

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

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

使用道具 举报

2

主题

26

帖子

288

积分

③业余

积分
288
QQ
发表于 2007-10-5 22:20:35 | 显示全部楼层
不过代码格式也是个问题,楼主可以用源代码格式化工具整理一下,就知道格式化后的代码看起来是比较舒服的。
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 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么...? 至少代码上是这么写的,结果也是对的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-2 18:57 , Processed in 0.021611 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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