打印上的输出

output on the printf

本文关键字:输出 打印      更新时间:2023-10-16

有没有人可以给我一个重要而简单的解释,我试图理解这个程序下面的关于 C 编程中的 printf 这里是代码......

#include <stdio.h>
  int main()
   {
    int a,b;
    float c;
      a = 1;
      b = 2;
      c = 3.;
    printf("%d %d %fn",a ,b , c);
    printf("%d %f %fn",a ,b , c);
    printf("%f %d %fn",a ,b , c);
    printf("%d %d %dn",a ,b , c);
    printf("%f %d %dn",a ,b , c);
   return o;
    }

输出为

1  2  3.000000
1  0.000000  0.000000
0.000000  0  0.000000
1  2  0
0.000000  0  1074266112

我非常清楚第一个 printf 的输出但是为什么第二个 printf 输出 1 0.000000 0.000000

而不是1 0.000000 3.000000

第三版0.000000 0 3.000000

第五版0.000000 2 0.000000

除第一个语句外,所有printf()语句的行为都是未定义的。因此,您不能期望它们以任何特定方式行事。

若要解决此问题,需要将数值参数强制转换为printf(),以便其类型与格式说明符匹配。编译器不会自动执行此转换,尽管一些好的编译器会发出警告以提醒您注意错误。

当你把一个int传递给printf()并告诉它把它当作一个float时,你会得到与垃圾对应的垃圾(GIGO(。 基本上,printf()和编译器都无法为您进行任何转换。你必须把它做好。 必须提供与格式规范匹配的参数。 这些注释适用于所有printf()scanf()系列函数。

如果使用 GCC 和字符串文本作为格式字符串(如示例中所示(,您将收到有关类型不匹配的编译器警告。 注意并修复它们;编译器知道的比你多。 如果您使用的其他编译器不会发出此类警告,请找到一个给出此类警告的编译器(例如 GCC( 并使用它。 并确保打开警告 - 并且代码编译时不会发出任何警告。

您在第二个和后续语句中调用"未定义的行为",这意味着任何和所有答案(以及其他行为,包括崩溃和重新格式化磁盘(都是系统可接受的响应。

您遇到了未定义的行为。运行时期望一个float,而你给它一个int

展开上面的答案,并给出导致未定义行为的原因的线索。 在你的平台上,浮点数与 ints 的大小不同,所以 printf(( 不仅关于其参数的类型是错误的,而且关于它们在内存中的位置也是错误的。 因此,在第二行中,printf 在打印第三个值时不会查看浮点数的开头;它正在寻找别的地方。