c - 乘除法 : weird output in c

标签 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;
}

运行时,我以为输出会是-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/

相关文章:

c - && 和 || 的区别在 c 和 unix shell 中?

c++ - gdb和ffmpeg编译

java - 找到一个数字的真正大幂

java - Java中生成多个列表的所有排列

database - KD-Trees 和缺失值(向量比较)

math - 在 GL ES 中将片段着色器渐变结果从黑色转换为透明

html - 从 CGI 输出中删除不需要的字符

c - 将文件中特定点的数字存储为 (x, y) 坐标

c - OpenSSL AES_cbc_encrypt 与 EVP 接口(interface)

python - 如何在不重复的情况下生成 5 个字符的字符串组合(2 个不同的数字、两个相等的字母和 1 个字母)