1

我正在使用代码块来学习 c。我的代码是

#include<stdio.h>
#include<math.h>
int main()
{
  int x;
  x = pow(5,2);
  printf("%d", x);
}

Output is 25

当我使用此代码时

#include<stdio.h>
#include<math.h>
int main()
{
  int x,i,j;
  printf("please enter first value");
  scanf("%d", &i);//5
  printf("please enter second value");//2
  scanf("%d", &j);
  x = pow(i,j);
  printf("%d", x);
}

Output is 24

这里有什么问题?我只是在使用扫描功能并以同样的方式使用 pow 功能来获取价值。

4

5 回答 5

8

我怀疑你有一个幼稚的实现powlibm我得到 25,应该是)。如果在不检查(小)积分指数和特殊处理的情况下计算为正数,你pow(x,y)exp(y*log(x))得到x

Prelude> 2 * log 5
3.2188758248682006
Prelude> exp it
24.999999999999996

结果double略小于 25,因此当它转换为int它时,它会被截断为 24。

要检查,请将结果分配pow(i,j)给 adouble并打印出来。

使用 hardcoded pow(5,2),编译器(很可能,即使没有优化也是 gcc 所做的)在编译期间精确计算结果。

于 2013-02-24T11:04:34.373 回答
2

尝试将初始化更改为:

int x=-1 ,i=-1 ,j=-1;

最后打印到这个:

printf("pow(%d, %d) == %d\n", i, j, x);

这应该很好地暗示了这个问题。此外,检查 的返回值scanf,它们应该返回读取的项目数,即。1 上面的代码。

几乎可以肯定,您为 scanf 输入了无效输入,i或者j未初始化,而 24 只是垃圾值。

此外,在启用警告的情况下进行编译,并修复它们(例如,添加return 0;到 end of main)。

于 2013-02-24T10:58:56.663 回答
1

您的代码在我的 Windows x64 上正确给出了 25。

您可能需要再次运行它,看看您是否读错了……
缺少的“返回 0;” 不是这里的问题。

如果有任何事情可能出错,
您可以尝试添加

fflush(stdin);//or out

在非常 scanf 和 printf 之后。如果任何冲洗解决了您的问题,您就知道出了什么问题。

于 2013-02-24T10:56:05.560 回答
0

使用您的代码,我得到了正确的结果 25。虽然尝试更改结果的数据类型,例如浮点数或双精度数。

于 2013-02-24T15:53:00.303 回答
0

貌似第二个程序没什么问题,除了最后一定要加

return 0;

如果你用 2 读取值 j,那么结果将只有 25。

于 2013-02-24T10:58:25.850 回答