为什么输出是16? (C 编程)

Why is the output 16? (C pogramming)

#include<stdio.h>

#define sqr(x) x*x

int main()    
{    
    int a = 16/sqr(4);

    printf("%d", a);    
}

如果我没记错输出应该是1 作为 ,a = 16/sqr(4) 给出 16/16 => 1

但输出是 16

这仅在我使用除法运算符 (/) 时发生,在使用其他运算符时我得到正确的输出

我可以知道原因吗? ..谢谢

16 / 4 * 4(16 / 4) * 4 = 16

寓意:时刻注意宏。在你的情况下,你应该用括号括起来:

#define sqr(x) ((x)*(x))

这个宏仍然存在问题,因为它对参数求值两次。

例如:

int read_int();

int a = 16 / sqr(read_int());

会意外地计算 read_int() 两次,因为它扩展为:

int a = 16 / ((read_int() * (read_int());

建议是为此使用函数。使其内联,以便为编译器提供更好的优化机会。

a = 16/sqr(4);

展开上面的表达式给出:

a = 16 / 4 * 4

这是基于正常数学运算顺序的 16。

这就是为什么宏应该始终用括号括起来的原因:

#define sqr(x) ((x) * (x))

您是否正在尝试创建一个函数定义?如果是,那么我认为它不应该在 #define 上。相反,创建一个函数 sqr(x)。方法如下:

#include <stdio.h>

int sqr(int x)
{
    return x*x;
}

int main()
{
    int a = 16/sqr(4);

    printf("%d", a);
}

你会得到结果 1。

编辑:但无论如何,您已经通过宏获得了解决方案。这只是做你想做的另一种方式。