乘法和除法:c中的奇怪输出

Sal*_*din 1 c math

我读到*(乘法)具有比/(除法)更高的优先级.因此,如果有既与方程*和/,则*必须首先发生.

但我看到一个程序输出一些奇怪的东西

#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)

有人可以解释一下吗?

rod*_*igo 6

括号偏执狂!你的宏应该是:

#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.

结论:在宏中写了很多括号.到处.