gcc中的printf错误结果

gcc中的printf错误结果,c,gcc,floating-point,C,Gcc,Floating Point,案例1: printf(“%f”,7/2))为0.000000 案例2: float k=7/2 printf(“%f”,k)为3.000000 在第一种情况下,printf期望float,但得到整数,因此给出错误的结果。但在第二种情况下,它进行类型转换 以下是我的问题- 为什么gcc在第一种情况下不给出类型不匹配错误/警告 在第二种情况下,它默认进行类型转换,但在第一种情况下为什么不呢 在第二种情况下,它默认进行类型转换,但在第一种情况下为什么不呢 在第一种情况下,7和2都是int类型。将7除

案例1:
printf(“%f”,7/2))为0.000000

案例2:
float k=7/2
printf(“%f”,k)为3.000000

在第一种情况下,printf期望float,但得到整数,因此给出错误的结果。但在第二种情况下,它进行类型转换

以下是我的问题-

  • 为什么gcc在第一种情况下不给出类型不匹配错误/警告
  • 在第二种情况下,它默认进行类型转换,但在第一种情况下为什么不呢
  • 在第二种情况下,它默认进行类型转换,但在第一种情况下为什么不呢

    在第一种情况下,
    7
    2
    都是
    int
    类型。将
    7
    除以
    2
    将得到
    int
    。使用
    %f
    打印它将调用未定义的行为。你会得到任何东西。在这种情况下,没有类型转换

    试试这个

    printf("%f", (7.0/2));  
    
    在第二种情况下,
    k
    float
    类型,因此默认情况下,
    7/2
    的结果转换为
    k
    类型

    为什么gcc在第一种情况下不给出类型不匹配错误/警告

    使用
    -Wall
    标志编译第一条语句会发出警告:

    [Warning] format '%f' expects argument of type 'double', but argument 2 has type 'int' [-Wformat=]
    
    1) 默认情况下,gcc不会检查带有参数的格式字符串中的类型,因此它会在运行时将数据(即整数)解释为float


    2) gcc现在在运行时将浮点解释为浮点。

    gcc可以发出警告,但您没有启用它。尝试使用flag
    -Wall
    编译,您将看到:

    warning: double format, different type arg (arg 2)