august 发表于 2007-10-5 23:09:00

果然是好复杂

lw 发表于 2007-10-5 23:09:26

引用第9楼rednaxela于2007-10-05 22:25发表的:

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:

august 发表于 2007-10-5 23:11:19

那要写出完全正确的,应该怎么写呢?

lw 发表于 2007-10-5 23:14:13

ToT。LZ请把每个人的意见综合一下就可以了^^

当然程序的本意还得你自己决定,我们只是就事论事,想到说到罢了= =

rednaxela 发表于 2007-10-6 00:04:19

恩我眼花没看到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);
}

...

方法实在是太多了.

lw 发表于 2007-10-6 08:14:31

如果这是什么思考题这类的话,那就比较囧了……

PS: 为啥那个可爱的STATIC被删掉了啊- -

shawind 发表于 2007-10-6 09:31:42

引用第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的警告。这玩意只有想不到的,没有做不到的...

lw 发表于 2007-10-6 09:59:38

偶以前一般在使用VC71或者VC8的时候开W4,至于ALL……还没用过
不过貌似/W4会被取消??

august 发表于 2007-10-6 13:27:23

请问那个警告级别在哪里开?

rednaxela 发表于 2007-10-6 15:50:07

通过命令行编译的话,可以用/W开关
通过IDE编译的话,可以找build的选项.一般在project settings之类的地方(看是什么IDE了)
页: 1 [2]
查看完整版本: 程序C