C算术表达式与printf不一致并赋值给另一个变量
C arithmetic expression inconsistency with printf and assignment to another variable
下面的程序为 a/100 输出不同的值,其中 a 是整数。
void main()
{
int a = -150;
float f;
f = a/100;
printf(" %f,%f ",f,a/100);
}
输出:-1.000000,0.000000
这里第二个%f值是0.000000,怎么可能,应该是-1.000000或者-1.500000。
没有不一致:
f = a/100;
执行存储为浮点数的整数除法:结果1.0
然后
printf(" %f ",a/100);
打印一个整数 (1),但采用浮点格式:未定义的行为。
这毫无意外地有效:
void main()
{
int a = -150;
float f;
f = a/100.0;
printf(" %f,%f ",f,a/100.0);
}
printf
是一个可变参数函数(原型:void printf(const char *,...)
),除了 "believe" 您传递的格式之外别无选择。
如果您告诉 printf
第二个参数是浮点数,那么它会将参数字节流读取为 float
,如果数据不匹配 float
结构,好吧,它不会正常工作。
编辑:编译器制造商知道这是一个常见错误,因此他们为类似 printf 的函数添加了特殊检查:如果您使用 -Wall
或 -Wformat
使用 gcc 编译文件选项,您将收到以下明确消息:
foo.c:8:1: warning: format '%f' expects argument of type 'double', but argument 3 has type 'int' [-Wformat=]
printf(" %f,%f ",f,150/100);
(如果类似 %
的格式参数的数量和参数的数量不匹配,也是如此)。
下面的程序为 a/100 输出不同的值,其中 a 是整数。
void main()
{
int a = -150;
float f;
f = a/100;
printf(" %f,%f ",f,a/100);
}
输出:-1.000000,0.000000
这里第二个%f值是0.000000,怎么可能,应该是-1.000000或者-1.500000。
没有不一致:
f = a/100;
执行存储为浮点数的整数除法:结果1.0
然后
printf(" %f ",a/100);
打印一个整数 (1),但采用浮点格式:未定义的行为。
这毫无意外地有效:
void main()
{
int a = -150;
float f;
f = a/100.0;
printf(" %f,%f ",f,a/100.0);
}
printf
是一个可变参数函数(原型:void printf(const char *,...)
),除了 "believe" 您传递的格式之外别无选择。
如果您告诉 printf
第二个参数是浮点数,那么它会将参数字节流读取为 float
,如果数据不匹配 float
结构,好吧,它不会正常工作。
编辑:编译器制造商知道这是一个常见错误,因此他们为类似 printf 的函数添加了特殊检查:如果您使用 -Wall
或 -Wformat
使用 gcc 编译文件选项,您将收到以下明确消息:
foo.c:8:1: warning: format '%f' expects argument of type 'double', but argument 3 has type 'int' [-Wformat=]
printf(" %f,%f ",f,150/100);
(如果类似 %
的格式参数的数量和参数的数量不匹配,也是如此)。