为什么我的C程序会输出这个?

Ami*_*mar 3 c string-concatenation stringification c-preprocessor

我试图解决两个预处理器相关的问题,但在这两个程序中,我得到的结果是我无法弄清楚如何.以下是我的计划:

#include<stdio.h>
#define SQUARE(x) x*x
int main()
{
float s=10,u=30 ,t=2,a;
a=2*(s-u*t)/SQUARE(t);
printf("Result:%f\n",a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我说,这个程序的输出应该是,-25.000但我得到了-100.000.

在第二个程序中:

#define FUN(i,j) i##j
int main()
{
int val1 = 10;
int val12 = 20;
clrscr();
printf("%d\n",FUN(val1,2));
getch();
}
Run Code Online (Sandbox Code Playgroud)

输出应该是,102但我得到20; 为什么会这样?

Ale*_* C. 11

#define SQUARE(x) x*x
Run Code Online (Sandbox Code Playgroud)

应该

#define SQUARE(x) ((x)*(x))
Run Code Online (Sandbox Code Playgroud)

实际上,如果没有括号,2*(s-u*t)/SQUARE(t)则扩展为

2*(s-u*t)/t*t
Run Code Online (Sandbox Code Playgroud)

这被解释为

(2*(s-u*t)/t)*t
Run Code Online (Sandbox Code Playgroud)

至于你的第二个问题,FUN(val1,2)val12根据##运算符的语义进行扩展.目前还不清楚你的意图是什么:这printf条线将被理解为

printf("%d\n", val12);
Run Code Online (Sandbox Code Playgroud)

这将打印20.