当我使用实值(float和double类型)编写程序时,我正在努力处理一些错误。
当将“real”声明为double时,在watches调试工具中,与此变量相关的值不会以可理解的方式显示。另外,程序没有给我正确的输出,我想知道为什么。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,integer;
double real = 0;
double average = 0;
printf("enter a real value: ");
scanf("%f",&real);
for (i=0; average < real; i++){
printf("enter an integer: ");
scanf("%d",&integer);
average = float((average+integer)/(i+1));
}
printf("\n%d numbers have been added!", i);
printf("\nthe average of all entered numbers is: %.2f",average);
return 0;
}
有些变量不能对应,因为我现在已经把它翻译了,让你更容易理解。
我试过使用cast运算符,删除它们,在声明中使用float和double,都没有得到可接受的结果(程序也不会工作)
编辑:
程序正在运行,但仍有一些数学问题,结果不是我所期望的http://i.stack.imgur.com/Zl9dJ.jpg
最佳答案
当我用GCC编译你的代码时,我得到了:
gcc -Wall -std=gnu99 -Wextra -Werror -g -O3 -o q q.c
cc1: warnings being treated as errors
q.c: In function ‘main’:
q.c:10:5: error: format ‘%f’ expects type ‘float *’, but argument 2 has type ‘double *’
q.c:16:19: error: expected expression before ‘float’
make: *** [q] Error 1
这些警告标志很有用。要修复第10行的错误,请像评论中所说的那样使用%lf。
第16行的错误是因为
float
不是函数。您可以使用这样的类型转换:average = (float)((average+integer)/(i+1))
但这只是将结果转换成一个浮点数。如果要实际使用浮点数学而不是将整数数学转换为浮点,则需要浮点操作数。最简单的做法是使用浮点文字:
average = (average+integer)/(i+1.0)
实际上,由于average已经是double,所以无论如何,您都要用这个表达式进行浮点运算。尽管gnometorule在注释中指出,这可能不是您想要做的计算。您可能需要将输入的所有数字相加,然后除以最后的数字。这会让你变得刻薄。
您还需要在上次打印结束时打印换行符f:
printf("\nthe average of all entered numbers is: %.2f\n",average);
在调试方面,我不知道手表,但gdb是这样做的:
(gdb) p real
$1 = 7.2999999999999998
(gdb) p average
$3 = 121.14920634920635
您可能希望在关闭优化的情况下进行编译,以便在调试器中获得更完整的信息,但是doubles应该可以很好地打印出来。如果您正在查看包含它们的内存,您将需要查看[IEEE 754]。
关于c - “监视”调试工具上的值错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24311946/