繁体   English   中英

C算术表达式与printf和分配给另一个变量不一致

[英]C arithmetic expression inconsistency with printf and assignment to another variable

下面的程序输出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;

执行存储到float中的整数除法:结果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 *,...) ),除了“相信”您通过的格式外,别无选择。

如果您告诉printf第二个参数是float,则它将参数实参流读取为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);

(如果类似%的格式参数的数量与参数的数量不匹配,则相同)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM