printf中的奇怪输出()

时间:2014-04-14 16:35:36

标签: c printf

当我运行以下代码时

    #include <stdio.h>
    #include <stdlib.h>

    int main(){

     printf("2/10=%lf 2./10=%lf\n", 2/10, 2./10);
     printf("2/10=%lf\n",2/10);
     printf("2/10=%d\n",2/10);
     printf("2./10=%lf\n",2./10);
     return 0;
    }

我预计它会返回

    2/10=0.000000 2./10=0.200000
    2/10=0.000000
    2/10=0
    2./10=0.200000

而我得到

    2/10=0.200000 2./10=0.000000
    2/10=0.200000
    2/10=0
    2./10=0.200000
在稍微思考后,我可以理解,在第一行中2/10可以被解释为浮点除法而不是整数1,因为我已将%lf说明符放在printf()中(是真的会发生什么?)但我无法解释的是,为什么以下2./10打印0.000000而不是0.200000,就像它在第4行中那样。

任何人都可以向我解释一下吗?

编辑:

如果我稍微更改代码,我会

    #include <stdio.h>
    #include <stdlib.h>

    int main(){
      printf("2/10=%lf\n",2/10);
      printf("2/10=%lf 2./10=%lf\n", 2/10, 2./10);
      printf("2/10=%d\n",2/10);
      printf("2./10=%lf\n",2./10);
      return 0;
    }

    2/10=0.000000
    2/10=0.200000 2./10=0.000000
    2/10=0
    2./10=0.200000

似乎支持这样的观点,即第二个0.2语句中的printf()实际上与同一2./10中的0.0printf()的计算相对应}语句对某些未定义的行为......

1 个答案:

答案 0 :(得分:4)

2/10(整数除法)正在生成0类型int。使用错误的转换规范器打印数据会调用未定义的行为。

C11:7.21.6格式化输入/输出功能:

  

如果转换规范无效,则行为未定义。 282)如果任何参数是   不是相应转换规范的正确类型,行为是   未定义。