C算术表达式与printf不一致,并赋值给另一个变量
以下程序输出a/100的不同值,其中a为intC算术表达式与printf不一致,并赋值给另一个变量,c,expression,precision,numeric,C,Expression,Precision,Numeric,以下程序输出a/100的不同值,其中a为int 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 然后 打印整数(1),但采用浮点格式:
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
然后
打印整数(1),但采用浮点格式:未定义行为
这是毫无疑问的:
void main()
{
int a = -150;
float f;
f = a/100.0;
printf(" %f,%f ",f,a/100.0);
}
printf
是一个可变参数函数(原型:void printf(const char*,…)
),它除了“相信”所传递的格式之外别无选择
如果您告诉printf
第二个参数是浮点,那么它将通过testream将该参数读取为float
,如果数据与float
结构不匹配,那么它将无法正常工作
编辑:编译器制造商知道这是一个常见错误,因此他们为类似printf的函数添加了一个特殊检查:如果您使用gcc使用-Wall
或-Wformat
选项编译文件,您将得到以下显式消息:
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);
(如果类
%
格式参数的数量与参数的数量不匹配,则情况也是如此)。没有不一致:
f = a/100;
执行存储到浮点中的整数除法:结果1.0
然后
打印整数(1),但采用浮点格式:未定义行为
这是毫无疑问的:
void main()
{
int a = -150;
float f;
f = a/100.0;
printf(" %f,%f ",f,a/100.0);
}
printf
是一个可变参数函数(原型:void printf(const char*,…)
),它除了“相信”所传递的格式之外别无选择
如果您告诉printf
第二个参数是浮点,那么它将通过testream将该参数读取为float
,如果数据与float
结构不匹配,那么它将无法正常工作
编辑:编译器制造商知道这是一个常见错误,因此他们为类似printf的函数添加了一个特殊检查:如果您使用gcc使用-Wall
或-Wformat
选项编译文件,您将得到以下显式消息:
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);
(如果类
%
格式参数的数量与参数的数量不匹配,情况也是如此)。因此,除非强制转换,否则不应将%f与基础整数一起使用?(比如,我不想使用100.0作为分母)。我知道当你提到的修改完成后,它会正确打印。我想说的是,为什么在使用%f格式说明符时,不会固有地将int类型转换为float。@iharob:我当时是怎么想的:)编辑的。不需要进一步的复杂性…所以,除非强制转换,否则我不应该将%f与基础整数一起使用?(比如,我不想使用100.0作为分母)。我知道当你提到的修改完成后,它会正确打印。我想说的是,为什么在使用%f格式说明符时,不会固有地将int类型转换为float。@iharob:我当时是怎么想的:)编辑的。不需要进一步的复杂性。。。