0

这是我的程序:

#include <stdio.h>
int main()
{
    int a=0x09;
    int b=0x10;
    unsigned long long c=0x123456;
    printf("%x %llx\n",a,b,c);//in "%llx", l is lowercase of 'L', not digit 1
    return 0;
}

输出是:

9 12345600000010

我想知道:

  1. printf() 函数是如何执行的?
  2. 如果参数的数量不等于格式的数量会发生什么?

请帮助我并以该程序为例进行说明。

4

3 回答 3

2

问题是您的类型不匹配。这是未定义的行为。

您的第二个参数b与格式的类型不匹配。所以正在发生的事情printf()是读取超过保存 b 的 4 个字节(printf期望一个 8 字节的操作数,但b只有 4 个字节)。因此,您会变得垃圾。第三个参数根本不打印,因为您printf()只有 2 个格式代码。

由于参数通常在内存中连续(且相邻)传递,因此printf()正在读取的 4 个额外字节实际上是c.

所以最后,正在打印的第二个数字等于b + ((c & 0xffffffff) << 32)

但我想重申:这种行为是 undefined。只是当今大多数系统的行为都是这样的。

于 2011-09-18T09:30:17.127 回答
1

如果您传递给的参数printf与格式规范不匹配,那么您会得到未定义的行为。这意味着任何事情都可能发生,您无法推断您碰巧在特定系统上看到的结果。

在您的情况下,%llx需要类型的参数和参数,unsigned long long但您提供了int. 仅此一项就会导致未定义的行为。

printf传递的参数多于格式说明符不是错误,多余的参数被评估但被忽略。

于 2011-09-18T09:32:13.943 回答
0

printf()根据格式一次增加一个读取参数的指针。如果格式化参数的数量大于参数的数量,则 printf() 将从未知内存位置输出数据。但是,如果参数的数量大于格式化参数的数量,则不会造成任何损害。例如,如果格式化参数和参数的数量不匹配,gcc 会警告您。

于 2011-09-18T09:32:09.310 回答