C语言:这两种写法有什么区别啊

来源:百度知道 编辑:UC知道 时间:2024/05/27 06:37:26
//求M个学生N门课成绩中最大值对应第几位学生第几门课程
#define M 2
#define N 2
#include"stdio.h"
int A,B;
float max(float a[M][N])
{
int i=0,j=0;
float max=0;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
if(a[i][j]>=max)
{max=a[i][j];A=i;B=j;}
}
return max;
}
void main()
{
int i=0,j=0;
float score[M][N]; //输入1 2 3 4
printf("分别输入%d个学生%d门课的成绩\n",M,N);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%f",&score[i][j]);
printf("\n最高分:%.2f 是第%d个学生,%d门课\n",max(score),A+1,B+1); //结果不对
/*
float h=max(score);
printf("\n最高分:%.2f 是第%d个学生,%d门课\n",h,A+1,B+1);
*/ //用这个就对了
}
/*上面两种写法有什么区别呢?第一种写法哪错了啊*/

在做这道题时刚开始省几步,用了第一种方法,但结果错了

printf使用了堆栈的方式,处理它的参数max(score),A+1,B+1
并且是从右往左进行处理的

比如:
printf("\n最高分:%.2f 是第%d个学生,%d门课\n",max(score),A+1,B+1);
不是先调用max(score),而是先把B+1,A+1的值入栈,然后调用max(score)计算结果,最后打印
而分成两句:
float h=max(score);
printf("\n最高分:%.2f 是第%d个学生,%d门课\n",h,A+1,B+1);
肯定是先调用max(score),会改变A和B的值,然后再打印h,A+1,B+1
所以,这两种方式得到的结果是不同的

max函数返回的是一个值而。h则是一个地址。。。

楼上正解
一个是先执行了max(score);后执行A+1,B+1
一个是先执行了A+1,B+1后执行max(score);
结果当然不同