LZ想要输出的不就是年龄最大的那个entry么...? 至少代码上是这么写的,结果也是对的
不,并不是FX所说的结果,因为这里迭代使用的是p++而p的变动是需要通过判断进行的,于是假设就是选择年龄最大的一个:
根据代码所示,一旦出现一个比后面一个大的元素,整个结果就立即敲定了,所以这里肯定是另外一种错误,就是if的处理句子,应该是把if的下面两句话对调:
if(m<p->age)
m=q->age;
q=p++;
反例也很容易举:
person={"zhang",20,"li",18,"wang",19,"sun",22};
结果是:
zhang,20
代码就算是短貌似也有内在的问题,所以BUG难调试ToT: 那要写出完全正确的,应该怎么写呢? ToT。LZ请把每个人的意见综合一下就可以了^^
当然程序的本意还得你自己决定,我们只是就事论事,想到说到罢了= = 恩我眼花没看到p++受判断影响.值得吐槽的地方果然是太多了.
就按照LZ原本的写法:
#include <stdio.h>
#define N 4
struct man
{
char name;
int age;
} person = { "li", 18,
"wang", 21,
"zhang", 20,
"sun", 22 };
void main(void)
{
int i;
int m = 0;
struct man* ptr = person;
struct man* res;
for (i = 0; i < N; i++, ptr++)
{
if(m < ptr->age)
{
m = ptr->age;
res = ptr;
}
}
printf("%s,%d",(*res).name,(*res).age);
}
-or-
#include <stdio.h>
#define N 4
struct man
{
char name;
int age;
} person = { "li", 18,
"wang", 21,
"zhang", 20,
"sun", 22 };
void main(void)
{
int i;
int m = 0;
int resOfs;
struct man* ptr = person;
for (i = 0; i < N; i++, ptr++)
{
if(m < ptr->age)
{
m = ptr->age;
resOfs = i;
}
}
printf("%s,%d",person.name,person.age);
}
...
方法实在是太多了. 如果这是什么思考题这类的话,那就比较囧了……
PS: 为啥那个可爱的STATIC被删掉了啊- -
引用第5楼rednaxela于2007-10-05 19:53发表的:
shawind没把警告级别全打开...我那是用了/Wall的
C:\\>dmc -w t.c
link t,,,user32+kernel32/noi;
C:\\>t
sun,22
开了警告也这德性...dmc和lc到底是不一样啊。dmc默认是有警告的,只是级别低点。
真要说起来,把lc的警告级别开到最大,然后把所有的警告当作错误,真不知道还能有多少程序能正常编译。
ps.那个著名的ogg的vorbis库里,居然还有把double隐式转成float的警告。这玩意只有想不到的,没有做不到的... 偶以前一般在使用VC71或者VC8的时候开W4,至于ALL……还没用过
不过貌似/W4会被取消??
请问那个警告级别在哪里开? 通过命令行编译的话,可以用/W开关
通过IDE编译的话,可以找build的选项.一般在project settings之类的地方(看是什么IDE了)
页:
1
[2]