【发布时间】:2020-07-20 08:59:21
【问题描述】:
#include <stdio.h>
#include <math.h>
int main() {
printf("%d\n", pow(3546, 0));
return 0;
}
上面的代码打印值0
虽然下面的代码打印值1
#include <stdio.h>
#include <math.h>
int main() {
int a = pow(3546, 0);
printf("%d\n", a);
return 0;
}
为什么会这样?尽管它们是等价的。
【问题讨论】:
-
第二个代码因为一个小错字而无法编译,否则我们需要更多关于编译器和编译器标志的信息来帮助你。我们可以得到的唯一提示是 pow 的结果隐式类型转换变成了哪种类型的整数。即使这样,大多数优化最少的编译器也会看到 pow 表达式是常量,并在编译过程中对其进行转换。
-
第一个是未定义的行为,这意味着任何事情都可能发生(并且没有一致性要求)