【问题标题】:How does format specifier know how many bytes to print?格式说明符如何知道要打印多少字节?
【发布时间】:2016-09-19 15:23:29
【问题描述】:

我有以下程序。

#include<stdio.h>
int main()
{
    char a='b';
    int b=11299;
    char d[4]="abc";
    printf("value of a is %d\n",a);
    printf("value of b is %c\n",b);
    printf("value of c is %d\n",*d);
    char *c=d;
    c=c+1;
    printf("c is %d\n",*c);
}

我对 %d 格式说明符有点困惑。我在想它会打印 4 个字节的数据。但是从上面的程序(第一个和最后一个 printf)可以明显看出,当使用 char 参数时它只打印一个字节。为什么 %d 只打印一个字节?它如何知道要打印多少字节?

【问题讨论】:

  • 这是basic MSVC page 关于printf 格式说明符,包含指向更多详细信息的链接,例如宽度。普通的%d 说明符将给定的参数打印为int,使用尽可能多的数字。
  • a 被传递给printf() 时,它会被编译器提升为int
  • char 被提升为int
  • 它既不打印 1 字节也不打印 4 字节。根据%d,它期望并打印一个int 值。 %c 类似(嗯,char 实际上是一个字节,所以...)

标签: c printf format-specifiers


【解决方案1】:

它不打印字节;它打印值——作为相应参数传递的值——只要传递的值具有正确的类型。

在您的示例 1 中,参数是值 'b'。它最初的类型为char(因为表达式a 的类型为char),但可变参数受默认提升的约束,它将排名低于int 的任何整数类型提升到int。因此,作为参数,类型是int

在您的示例 3 中,参数是值 'a'。同样,它最初的类型为char(因为表达式*d 的类型为char)但它被提升为int

如果促销没有发生并且类型错误,printf 仍然不会“打印更少的字节”。你的程序只会有未定义的行为(所以任何事情都可能发生)。例如:

int a = 42;
printf("%lld\n", a); // undefined behavior because int does not
                     // get promoted implicitly to long long.

在您的示例 2 中,%c 格式说明符需要 int 类型的参数; printf 将其转换为 unsigned char 并打印相应的字符。 int 的任何值都是可以接受的;它不必已经是unsigned char 范围内的值。

【讨论】:

    【解决方案2】:

    首先,您可能正在声明指定 ISO C90,这禁止混合声明和代码,如警告中所示。 char c 变量char * c = d; 类型的语句指针必须以语句字符串d char d [4] = "abc"; 为例,而不是在代码中间。 第二:int main (){ 函数不返回任何内容,但这必须指定不拉警告。

    修改后的程序是:

    #include<stdio.h>
    int main()
    {
        char a='b';
        int b=11299;
        char d[4]="abc";
        char *c=d;
        printf("value of a is %d\n",a);
        printf("value of b is %c\n",b);
        printf("value of c is %d\n",*d);
        c=c+1;
        printf("c is %d\n",*c);
        return 0;
     }
    

    【讨论】:

    • 呃,这个问题怎么回答?
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2015-01-16
    • 2021-07-13
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多