【发布时间】:2018-08-16 22:22:22
【问题描述】:
为什么会这样:
printf("%d\n", pow(1,0)); /* outputs 0 */
返回0?我预计它会返回1。
【问题讨论】:
-
我相信这里没有 C89 特有的内容。
为什么会这样:
printf("%d\n", pow(1,0)); /* outputs 0 */
返回0?我预计它会返回1。
【问题讨论】:
pow() 返回一个double 类型。您需要使用%f 格式说明符来打印double。
对提供的参数类型使用不适当的格式说明符会导致undefined behaviour。检查 C 标准 N1570 (C11) 的第 7.21.6.1 章。 (是的,这与C89 无关,恕我直言)
【讨论】:
您需要将结果类型转换为 int,因为 pow() 返回 double。
printf("%d\n",(int) pow(1,0));
这会给出你想要的输出 1
注意:pow(a,b) 在 a 和 b 都是 integers 时给出正确的结果,就像你的情况一样。但是在处理 fractions 时你需要 add 0.5 到结果,以便结果得到 四舍五入关闭到最接近的整数。
printf("%d\n",(int) (pow(2.1,0.9)))// will return 1.
printf("%d\n",(int) (pow(2.1,0.9)+0.5));//will return 2.
希望对你有帮助。
【讨论】: