[英]Why does my C program output this?
我试图解决两个预处理器相关的问题,但在这两个程序中,我得到的结果是我无法弄清楚如何。 以下是我的计划:
#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
; 为什么会这样?
#define SQUARE(x) x*x
应该
#define SQUARE(x) ((x)*(x))
实际上,没有括号, 2*(su*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
。
第一个:
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
,这就是你得到的。
这两个例子的要点是要记住我们应该首先处理定义(因为在“现实生活中”编译器(或预处理器)在运行时之前执行)
我希望它有帮助..
对于第一种情况,
a=2*(s-u*t)/SQUARE(t);
会翻译成
a=2*(s-u*t)/t*t;
在编译时。 这是预处理器常见的错误。
我知道我迟到了,但我得到了完美的答案。
在c#at define中用于调用函数参数中的文本,
例如,#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的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.