我有以下程序。
#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只打印一个字节?它如何知道要打印多少字节?
答案 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;
}