楼主,你让我怎么说你呢,!
你有两个极其严重的错误,我理解,因为这种错误如果不告诉你,你自己意识不到。
(1)如果你的max函数在main函数的后面,那么在调用max之前请先声明它,告诉编译器你有这么一个函数。放一条函数声明在前面:
int max(int,int,int);
这样编译器就知道了,你将在后面定义一个叫做max的函数。这样是一个比较好的习惯,但是比较麻烦的是,如果你的函数改动了,那么声明也要做相应改变。如果你想避免这个麻烦,那么把你的main函数放到最后面去!
(2)你的max函数里面犯了个很严重的逻辑错误,正确的逻辑是:(先不论你的代码效率了,假设按照你的思维来写:)
if (x
>=y&&x
>=z) m=x;
[bo]
else[/bo] if (y
>=x&&y
>=z) m=y;
/* 注意!!!这里的else被你给漏掉了!!!*/
else m=z;
请注意上面的第一个else不可以缺少!否则你的最后一个else就是和第二个if匹配!这样会导致逻辑错误。换句话说,只要y不是最大的情况,那么返回的就是z。例如你输入124,23,5;结果返回的是什么?返回的是5!这就是你缺少第一个else造成的严重后果。连续的if,else if,else,相当于switch-case分支选择结构,换句话说,类似并联的支路。只能走一条支路。而你缺少else之后,变成非switch-case的顺序结构,类似支路串联的结果了。这两种逻辑是有本质区别的,你可以自己花出这两种逻辑的流程图也是不同的。
请注意另一个逻辑错误是,上面的比较必须是“大于等于”,而不是“大于”,否则会导致什么错误呢,例如你输入100,100,3, 结果返回的是3!!!。
我觉得你这种思维非常的不清楚,其实很直观的,用stdlib.h中的宏来表达应该是:
return max(max(x,y),z); 它展开就是:
return (x>y? x:y)>z? (x>y? x:y):z;
如果我们用你所定义的m来写,那么应该是这样:
m=max(x,y);
return max(m,z);
展开结果是:
m=x>y? x:y;
return m>z? m:z;
我希望你能意识到这个问题的严重性!你的逻辑错误,比第一个那种经验上的错误更加严重100倍!三个数的找最大值写成这样,要是输入5个数,返回最大的数,不一定写成什么样子了,对于这种代码来说,我也真是没什么话可说了。
[[it] 本帖最后由 hoodlum1980 于 2008-3-13 02:22 编辑 [/it]]