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

时间:2011-03-07 11:54:23

标签: c c-preprocessor string-concatenation stringification

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

#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;
}

据我说,这个程序的输出应该是-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();
}

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

4 个答案:

答案 0 :(得分:11)

#define SQUARE(x) x*x

应该是

#define SQUARE(x) ((x)*(x))

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

2*(s-u*t)/t*t

被解释为

(2*(s-u*t)/t)*t

关于您的第二个问题,FUN(val1,2)将根据val12运算符的语义扩展为##。目前尚不清楚您的意图是什么:printf行将被理解为

printf("%d\n", val12);

将打印20

答案 1 :(得分:4)

第一个:

a=2*(s-u*t)/SQUARE(t);
更换定义后,我们得到:

a=2*(s-u*t)/t*t;

现在,由于我们在SQUARE的定义中没有(),我们得到:

a=2*(10-30*2)/2*2; --> a=2*(-50)/2*2; --> a=-100/2*2; --> a=-50*2; --> a=-100

如果您想获得-25,则应将SQUARE(x)定义为(x*x)

编辑:添加有关第二个示例的说明。

printf("%d\n"FUN(val1,2));

再次,我们首先应该替换define(提醒:##“连接”定义的字符串 - 我找不到完美的单词以便解释它所以请看一下这个例子...... ):

printf("%d\n",val12);  [note: the comma (,) is missing - so it won't compile.]

因为val12的值是20,这就是你得到的。

这两个例子的要点是要记住我们应该首先处理定义(因为在“现实生活中”编译器(或预处理器)在运行时之前完成它)

我希望它有所帮助..

答案 2 :(得分:3)

对于第一种情况,

a=2*(s-u*t)/SQUARE(t);

会转换为

a=2*(s-u*t)/t*t;

在编译时。这是预处理器常见的错误。

答案 3 :(得分:0)

我知道我来晚了,但是我的回答很完美。

in define中的c#中的

用于按功能参数中的原样调用文本

示例,#define hai(s1)printf(“%s =%s”,#s1,s1);

       in main: i am calling as hai(tom); tom was initialized as "india" string.

此输出为tom = india,调用字符串tom在#的帮助下打印。

类似地,##用于从函数参数中获取文本并将其连接起来并返回连接的标识符的值。

上面的程序有两个参数va1和2.传递给i和j。然后将va1和2连接起来。并形成va12。

va12是值20可用的标识符,这就是为什么返回20的原因。