程序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);
}
请问这程序有什么问题吗?偶看不出哪里有问题..... 单就运行结果来说没什么问题吧,编译可以通过,运行的结果是
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 理论上正确的写法应该是:
{
{"li",18,},
{"wang",19,},
{"zhang",20,},
{"sun",22},
};
当然某些逗号可省略
不过既然是指定了大小,而且C规定数组的连续性,自然没有问题
D:\\test>dmc t.c
link t,,,user32+kernel32/noi;
D:\\test>t
sun,22
no error & no warning 恩.除了编译警告和lw提到的之外,还有不少...
<stdio.h>
然后那个*q没有任何实际作用,完全可以只用*p去满足使用需求
混在一起写的声明和初始化从来都不是被推荐的...没人会因为这样少写几行代码而被认为更强,因为实际的有效代码行数还是一样. shawind没把警告级别全打开...我那是用了/Wall的 偶随便也喜欢随手写声明,但是有时候太懒用一堆大括号啊……
{
int i;
for( ;i; ... ) {}
}
偶倒是宁可写在一起了……相对更喜欢拆开函数这种……
不过这些都只是个人STYLE的问题巴……管不了别人嘛 随便说说:
static struct man // static不明其用处
if(m<p->age) // 此行多余
q=p++; //此行导致第一项重复打印,并且最后项没有打印出来
printf("%s,%d",(*q).name,(*q).age); //此行没有放在循环体内吧,这个错误加上上面的错误,导致最终结果打印的是最后一项数据? 不过代码格式也是个问题,楼主可以用源代码格式化工具整理一下,就知道格式化后的代码看起来是比较舒服的。 引用第7楼silekey于2007-10-05 22:16发表的:
随便说说:
static struct man // static不明其用处
if(m<p->age) // 此行多余
q=p++; //此行导致第一项重复打印,并且最后项没有打印出来
.......
LZ想要输出的不就是年龄最大的那个entry么...? 至少代码上是这么写的,结果也是对的
页:
[1]
2