C算术表达式与printf不一致,并赋值给另一个变量

C算术表达式与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),但采用浮点格式:

以下程序输出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.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:我当时是怎么想的:)编辑的。不需要进一步的复杂性。。。