为什么输出是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。
编辑:但无论如何,您已经通过宏获得了解决方案。这只是做你想做的另一种方式。
#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。
编辑:但无论如何,您已经通过宏获得了解决方案。这只是做你想做的另一种方式。