我在一个面试问题中遇到了一个c程序,.The程序的内容如下:
#include<stdio.h>
#define x 9+2/4*3-2*4+(5-4)*3
void main()
{
int i,y,p;
y=6+3*3/5;
printf("%d",x);
i=x*x+y;
printf("%d",i);
}这个程序的输出是30,但我不明白这个程序是如何产生的。有人能解释一下吗?
发布于 2022-02-27 16:20:53
在您的具体情况下,#define可以进行简单的文本替换。
第一个表达式(用于x)是
9+2/4*3-2*4+(5-4)*3
9+ 0 *3-2*4+ 1 *3
9+ 0 - 8 + 3
9 - 8 + 3
1 + 3
4 第二个表达式(用于i)是
9+2/4*3-2*4+(5-4)*3*9+2/4*3-2*4+(5-4)*3+y // y is 7
9+2/4*3-2*4+(5-4)*3*9+2/4*3-2*4+(5-4)*3+7 // doing parenthesis
9+2/4*3-2*4+ 1 *3*9+2/4*3-2*4+ 1 *3+7 // doing multiplications and divisions
9+ 0 *3- 8 + 3 *9+ 0 *3- 8 + 3 +7 // doing multiplications and divisions again
9+ 0 - 8 + 27 + 0 - 8 + 3 +7 // doing addition and subtraction left to right
9 - 8 + 27 + 0 - 8 + 3 +7
1 + 27 + 0 - 8 + 3 +7
28 + 0 - 8 + 3 +7
28 - 8 + 3 +7
20 + 3 +7
23 +7
30当使用操作编写#defines时,总是将整件事情括在一个额外的括号内:
#define x (9+2/4*3-2*4+(5-4)*3)发布于 2022-02-27 16:25:53
整数除法是答案的一部分,但更棘手的部分是#define。许多人假设定义#define时会对其进行评估,但它实际上只是一个简单的文本替换。所以当你被授予x*x时,你会得到
9+2/4*3-2*4+(5-4)*3*9+2/4*3-2*4+(5-4)*3注意,这是中间的3*9,如果假设x是一个简单的数字值,则不会得到这个值。以下是整个过程:
x * x
= 9+2/4*3-2*4+(5-4)*3*9+2/4*3-2*4+(5-4)
= 9 + 0 - 8 + 27 + 0 - 8 + 3
= 1 + 27 - 5
= 23然后,自从y=7,23 + 7 = 30
瞧
https://stackoverflow.com/questions/71286236
复制相似问题