c - C 中连续两次 printf() 调用的奇怪行为

标签 c printf

我在玩 C;检查一下:

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

void main() {
    printf("%d\n", 1.5);
    printf("%f", 0);
}

我期望输出:

0
0.000000

但它打印:

0
1.500000

第一个 printf() 是否将 1.5 传递给第二个 printf()

PS:我知道(%d 用于整数,%f 用于 float )。正如我提到的,我只是在搞乱代码。

PS2:我正在使用 DevC++ 和 Code::Blocks。

最佳答案

根据 C 标准,该行为未定义,这是您的系统上可能发生的情况:

  • 第一次来电printf("%d\n", 1.5); main传递浮点值 1.5作为第一个 XMM 寄存器中的 double 值并调用 printf() .
  • printf()不修改 XMM 寄存器,因为 if 不执行任何浮点运算来处理格式 "%d" .它从不同的地方检索要打印的值:寄存器或堆栈,而这个值恰好是 0 .
  • 第二次调用printf("%f", 0); , main也不会更改 XMM,因为它传递了 int 0 的值通过其他地方,寄存器或堆栈。
  • 第二个printf()终于得到了double %f 格式的值来自 XMM 寄存器 1.5之前已经存储了。因此输出 1.500000 .

以上都不能以任何方式保证,但这可能是您感兴趣的解释。不同的系统可能以不同的方式处理参数传递,它们是 ABI(应用程序二进制接口(interface))的一部分。

只是为了好玩,您可能想试试这个变体:

printf("first %d, second %f\n", 1.5, 42);

在我的系统上输出first 42, second 1.500000

关于c - C 中连续两次 printf() 调用的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44871982/

相关文章:

c - 通过 snprintf 在 C 中填充静态字符串缓冲区

c - strcat 和段错误 11

c - 哪个 C 头文件定义了公共(public)变量名称(PATH、HOME、IFS...)?

c - 重用 malloc() 分配的内存空间

c - fgetc 总是返回值 1

c - C 的 printf 中的数字分组

c - 使用 C 我想格式化我的输出,以便终端中的输出一旦到达窗口边缘就停止

c - += uint16_t 的运算符将分配的值提升为 int 并且不会编译

c - 保存二维动态数组(矩阵)用于全局访问 c

c - 素数阅读器