格式说明符如何知道要打印多少字节?

时间:2016-09-19 15:23:29

标签: c printf format-specifiers

我有以下程序。

#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只打印一个字节?它如何知道要打印多少字节?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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范围内的值。

答案 1 :(得分:0)

首先,您可能声明指定ISO C90,这禁止混合声明和代码,如警告中所示。 char c varible 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;
 }