我读到 *
(乘法)比 /
(除法)有更高的出现率。因此,如果存在同时包含 *
和 /
的等式,则 *
必须先出现。
但是我看到一个程序输出了一些奇怪的东西
#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", a);
return 0;
}
运行时,我以为输出会是-25,但实际上是-100。
当我寻找解释时是
Step 2: a = 2*(s-u*t)/SQUARE(t); becomes,
// Here SQUARE(t) is replaced by macro to t*t
=> a = 2 * (10 - 30 * 2) / t * t;
=> a = 2 * (10 - 30 * 2) / 2 * 2;
=> a = 2 * (10 - 60) / 2 * 2;
=> a = 2 * (-50) / 2 * 2 ;
/*till here it's OK*/
/*why it divided -50 by 2 before multiplying 2*2 and -50*2 */
=> a = 2 * (-25) * 2 ;
=> a = (-50) * 2 ;
=> a = -100;
谁能解释一下?
最佳答案
括号偏执狂!您的宏应该是:
#define SQUARE(X) ((x)*(x))
否则优先规则和宏扩展会做奇怪的事情。你的宏:
100 / SQUARE(2)
将扩展为:
100 / 2*2
读作:
(100/2) * 2
这是 100,而不是 25。
其他不在您的代码中的异常情况是,如果您尝试对表达式求平方:
SQUARE(2+2)
将扩展为
2+2*2+2
这是 8
,而不是预期的 16
。
结论:在宏中写了很多括号。无处不在。
关于c - 乘除法 : weird output in c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060979/