以下程序的输出结果是 #define MIN(x, y) (x) < (y) ? (x) : (y) main() { int i , j, k; i = 10; j = 15;

答案给的是15啊 怎么回事呢 我是初学者吗,马上要考试了 哪位大神给解释下啊
以下程序的输出结果是
#define MIN(x, y) (x) < (y) ? (x) : (y)
main()
{ int i , j, k;
i = 10; j = 15;
k = 10 * MIN(i, j);
printf(“%d\n”, k);
}

A、10
B、150
C、15
D、100

结果为15。

程序的第一行进行带参宏定义,用宏名MIN表示条件表达式(x) < (y) ? (x) : (y) ,形参x,y均出现在条件表达式中。程序中 MIN(i,j) 为宏调用,实参i,j,将代换形参x,y。

宏展开后该语句为: 10*(i) < (j) ? (i) : (j),运算结束的结果为15。

宏只是做了简单的替换操作。而函数的参数只在函数调用时求值一次,并将结果传递给函数即可。

define,无参宏定义的一般形式为:#define 标识符 字符串

define 函数定义一个常量

常量类似变量,不同之处在于:

在设定以后,常量的值无法更改。

扩展资料:

对于宏定义还要说明以下几点:

1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

2.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

3.宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。

参考资料:

百度百科-define

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-02-28
宏定义最重要的就是要把握原样代入的原则,不要主观的加括号

#define MIN(x, y) (x) < (y) ? (x) : (y)
所以:
10 * MIN(i, j)
=10*i<j?i:j
注意现在10*i被结合了,将i = 10; j = 15代入,变成:
=10*10<15?10:15
=100<15?10:15

由于100<15为假,所以k=15追问

大侠 能加你Q吗 我还有好多问题啊.....

追答

在加班了,不能Q~~
你直接起帖吧,现在回答的人多

追问

按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出,main()
{ int n,k;
float score,sum,ave;
sum=0.0;
for(n=1;n<=10;n++)
{
for(k=1;k<=4;k++ )
{
scanf("%f",&score);
sum+=score;
}
ave=sum/4.0;
printf("NO%d:%f\n",n,ave);
}}上述程序运行后结果不正确,调试中发现有一条语句出现在程序中的位置不正确。这条语句是B
B、sum=0.0;

追答

main()
{ int n,k;
float score,sum,ave;
// sum=0.0; 不应该放在这里
for(n=1;n<=10;n++)
{
sum=0.0; //应该放在这里,因为是需要计算没有学生4门成绩的平均分
for(k=1;k<=4;k++ )
{
scanf("%f",&score);
sum+=score;
}
ave=sum/4.0;
printf("NO%d:%f\n",n,ave);
}}

本回答被提问者和网友采纳
第2个回答  2011-12-21
首先你要明白#define MIN(x,y) (x)<(y)?(x):(y).的意思,这是一个带参数的宏定义,起作用就是一个简单的替换。其次你要明白 ? :是一个三目运算符。问号前面的表达式为真的话表达式的值就是?后面的值,要是假的话就是:后面的值。所以有:
k=10*MIN(j,k)=10*MIN(10,15)=10*10<15?10:15=15
第3个回答  2011-12-21
我被绕进去了半个多小时,终于清醒了,答案是15.
关键在 (x) < (y) ? (x) : (y)
对MIN(x,y)进行宏定义的时候,保险起见,应该写成((x)<(y)?(x):(y))。为什么外面再加个大括号呢,我一开始算的时候就是按照10小于15成立,所以MIN(i,j)等于i等于10,所以k=100。但是这是外面加了个大括号才这么算的。没加的话,就是这道题,结果就是k=10*x<y?x:y;即k=10*i<j?i:j,先计算乘法,k=100<15?10:15,也就是说100<15不成立,所以k=j=15。
所以宏定义的时候最外面有没有大括号很关键。
第4个回答  2011-12-21
宏定义是按字符串完全展开。完全的字符串替换。
所以k = 10 * MIN(i, j);
展开是:k=10*(i) < (j) ? (i) : (j);
i是10,10*i 是100,
100<15,是假,所以k=j 所以是15.

以下程序的输出结果是 #define MIN(x, y) (x) < (y) ? (x) : (y...
结果为15。程序的第一行进行带参宏定义,用宏名MIN表示条件表达式(x) < (y) ? (x) : (y) ,形参x,y均出现在条件表达式中。程序中 MIN(i,j) 为宏调用,实参i,j,将代换形参x,y。宏展开后该语句为: 10*(i) < (j) ? (i) : (j),运算结束的结果为15。宏只是做了简单的替换...

#define MIN(x,y) (x)<(y)?(x):(y) #include “stdio.h” void main...
k=10*MIN(i,j);由于MIN定义为宏后,该等式被替换为:k=10*(x)<(y)?(x):(y) =10*(10)<(15)?10:15 由于乘法优先级高于比较优先级,因此:k = 100<15?10:15 由于100不小于15,因此值等于15

c语言:#define MIN(x,y) (x)<(y)?(x):(y)
k=10*MIN(i,j)宏展开即k=10*(i)<(j)?(i):(j)根据运算符优先级即 k=(10*(i))<(j)?(i):(j)显然10*10<15为假

写一个标准的宏#define MIN(X,Y) ((X)>(Y)?(Y):(X)) MIN(X,Y)是什么...
Min(X,Y)后面跟的是一个条件语句,也就是 如果x>y时,MIN(X,Y)的值就为第一个值,也就y;如果x<y时,MIN(X,Y)的值就为第二个值,也就是x。实际上就是取最小值。

C语言如果
define MIN(x,y) (x)<(y)? (x):(y)main(){ int i=10,j=15,k;k=10*MIN(i,j);printf("%d\\n",k);} K等于15,是因为宏展开导致优先级错误而引起的 这句话,经过预编译,展开后,变成:k=10*10<15?10:15;由于没有括号,10*10先运算了,导致结果与预期不同 所以,正确的应该...

2.以下程序的运行结果是___.
2)答案为100 :MIN(x,y) (x)<(y)?(x):(y) 表示当x<y时取x,否则取y.题中i<j所以min(x,y)=10;3)答案为12,6;z=y*x/2=6*(5/2)=6*2=12(整数的除数也取整数);--a表是先将a减一再取值.4 1)b 2)d 3)c ...

在C语言中如何用标准宏定义实现计算两个参数中的最小值
define MIN(x,y)(x<y?x:y),这样定义后,宏表达式则可能出现问题,不是想要的结果,比如下面的例子,可以看出区别,编译器不同结果可能不同。include <stdio.h> define MIN1(x,y)(x<y?x:y)define MIN2(x,y)((x)<(y)?(x):(y))int main(int argc, char *argv[]){ int x=10,...

#define MAX(x,y) (x)>(y)?(x):(y) main(){int a=5,b=2,c=3,d=3,t...
宏不做类型判断,编译的时候就是简单的替换,所以在判断宏的时候,如果看不明白,你就在纸上写一下,把要替换的语句直接替换了,一看就明白了。这句替换完就是 t=(a+b)>(c+d)?(a+b):(c+d)*10,优先级高于:所以就等价于:7>6?7:60 所以结果就是7 ...

MIN(x,y) (x)<(y)?(x):(y)这里是什么意思,怎么会输出15
用宏定义实现一个小的宏MIN(x,y),会输出x和y中小的那一个。但要注意,预编译只是单纯的替换操作,而不能视为简单的函数调用。因此在k=10*MIN(i,j)语句中,编译器将该条语句替换为k=10*(i)<(j)?(i):(j),先执行10*i得到100,最后实际计算的是100<15?10:15,条件为假因此输出15。

...有以下程序 #define F(X,Y)(X)*(Y) main() { int a=3, b=4; pri...
结果等于12;运行完了之后,a = 4; b = 5;程序,结果如图:

相似回答