c语言 看程序写出结果的问题

程序1:
#define MAX(x,y,z) x*(y)+z
main()
{
int a=1,b=2,c=3;
print("%d\n",MAX(a+b,b+c,c+a));
}
程序2
#include <stdio.h>
void f(int *q)
{ int i=0;
for(;i<5;i++)
(*q)++;
}
main()
{ int a[5]={1,2,3,4,5},i;
f(a);
for(i=0;i<5;i++)
printf("%d,",a[i]);
}

不仅仅单单的寻求结果,重要的是求输出前的分析详细过程

#define MAX(x,y,z) x*(y)+z//宏定义,定义MAX(x,y,z)=x*(y)+z
main() //主函数
{
int a=1,b=2,c=3; // 声明变量a,b,c并赋值
printf("%d\n",MAX(a+b,b+c,c+a));//因为宏定义是用标识符来代表一个字符串
} //所以MAX(a+b,b+c,c+a)被替换成了(a+b)*(b+c)+(c+a)
#include <stdio.h>//头文件,包含输入输出函数,供主函数调用
void f(int *q) //定义子函数f(int *q),q为指向数组的指针
{ int i=0;
for(;i<5;i++)//数组每个数值加1
(*q)++;
}
main()//主函数
{ int a[5]={1,2,3,4,5},i;
f(a); //调用子函数,从子函数出来,*q=6,因为,q为指向数组的指针,
//所以,a[0]=*q=6,
for(i=0;i<5;i++)//一次输出数组的值
printf("%d,",a[i]);
}
结果6,2,3,4,5.调用数组时,a总代表着数组开始调用前的地址
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-08
1、15
#define MAX(x,y,z) x*(y)+z仅仅是将程序中出现MAX()的地方替换为x*(y)+z,不做其他的检查。所以替换后的结果为a+b*(b+c)+c+a,即1+2*(2+3)+3+1=15。
2、结果为:6,2,3,4,5,(因为是*(p)++,如果想输出的是2,3,4,5,6的话,应该改为*(p+i)++)。
由于f()的参数为指针,指向数组a,所以在f()中对数组的操作,将直接改变原数组中的值。
第2个回答  2010-05-08
程序1,这题考#define 宏定义的注意事项。宏仅仅是替换,MAX(a+b,b+c,c+a)的替换式是1+2*(2+3)+3+1=15,而非惯性思维所想象的x的值*y的值+z的值即3*(5)+4。为避免出现这种情况,用#define定义表达式时,应注意加括号。

程序2,函数f(int *q)中,对数组a[5]中的a[0]元素自加了5次,所以输出结果为6,2,3,4,5. f(a)传递了数组的首地址,(*q)即a[0]
相似回答