C语言的两道题...为什么..

来源:百度知道 编辑:UC知道 时间:2024/06/19 02:50:01
1.以下选项中合法的字符常量是
A."B"
B.'\010'
C.68
D.D

为什么这答案是选B...C的68不也可以当作一个字符型的常量吗?

2.
#include <stdio.h>
#define M(x,y,z) x*y+z
void main(void)
{
int a=1,b=2, c=3;
printf("%d\n", M(a+b,b+c,c+a));
}

这题为什么是等于12而不是19呢`

第一题:因为他说的是字符常量,而c中虽然可以直接赋给字符变量,但是它本身是整形,而非字符型。你应该特别注意变量、常量的区别。
第二题:我们知道预处理命令事实上知识一些代号而已,M(a+b,b+c,c+a)事实上是按照如下计算的:a+b*b+c+c+a=12.
PS:如果你想得到19的话必须如下定义:
#define M(x,y,z) (x)*(y)+(z).(当然了,最后z的括号可以不加的呵呵~)

1.68是数值,不是字符常量。字符常量是要用两个单引号括起来的。
2.宏的定义只是简单的替换而已。按你的例子,M(a+b,b+c,c+a),会被解释为
a+b*b+c+c+a=1+2*2+3+3+1=12。如果想等于19,那么在调用时,应该用M((a+b),(b+c),(c+a)),每一项都要用括号括起来。

第一题:用""括起来的是字符串常量,字符常量必须且只能用''单引号,C,D就不对了
第二题:估计你对宏的理解不对 执行到 M(a+b,b+c,c+a))时,它按宏展开时 a+b*b+c+c+a,结果所以是12,也就是说它不是像函数那样那样传值,要想得到19,则应该这样定义:
#define M(x,y,z) ((x)*(y)+z)
或者在调用时候这样写:
printf("%d\n", M((a+b),(b+c),(c+a)));
更常用上面一种方法