我读到*(乘法)具有比/(除法)更高的优先级.因此,如果有既与方程*和/,则*必须首先发生.
但我看到一个程序输出一些奇怪的东西
#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;
}
Run Code Online (Sandbox Code Playgroud)
运行时,我认为输出为-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;
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
括号偏执狂!你的宏应该是:
#define SQUARE(X) ((x)*(x))
Run Code Online (Sandbox Code Playgroud)
否则优先规则和宏扩展会做奇怪的事情.你的宏:
100 / SQUARE(2)
Run Code Online (Sandbox Code Playgroud)
将扩展到:
100 / 2*2
Run Code Online (Sandbox Code Playgroud)
这被解读为:
(100/2) * 2
Run Code Online (Sandbox Code Playgroud)
这是100,而不是25.
其他异常,而不是在您的代码中,如果您尝试对表达式求平方:
SQUARE(2+2)
Run Code Online (Sandbox Code Playgroud)
将扩大到
2+2*2+2
Run Code Online (Sandbox Code Playgroud)
这8不是预期的16.
结论:在宏中写了很多括号.到处.