printf(“d”和“string”在C中是如何工作的?

printf(“d”和“string”在C中是如何工作的?,c,string,int,printf,C,String,Int,Printf,我正在修改一些C概念,并尝试了以下方法: printf("%d %d %d", "%da", 'a', 'A'); //16079992 97 65 我可以理解,对于a和a,它会打印ASCII值:97和65。但是,我不明白为什么它会为“%da”打印16079992。事实上,我不明白当用%d将字符串输出为整数时,C如何解释字符串。这背后一定有某种算法/逻辑。有人吗?C中的字符串是指针,它有一个数值(地址)。因此printf只是在那里打印字符串的地址。C中的字符串文字是字符数组,在这种情况下,它将

我正在修改一些C概念,并尝试了以下方法:

printf("%d %d %d", "%da", 'a', 'A'); //16079992 97 65

我可以理解,对于
a
a
,它会打印ASCII值:
97
65
。但是,我不明白为什么它会为
“%da”
打印
16079992
。事实上,我不明白当用
%d
将字符串输出为整数时,C如何解释字符串。这背后一定有某种算法/逻辑。有人吗?

C中的字符串是指针,它有一个数值(地址)。因此printf只是在那里打印字符串的地址。

C中的字符串文字是字符数组,在这种情况下,它将衰减为指向第一个元素的指针

但是,您有未定义的行为,因为您在
printf
中错误指定了格式字符串,并告诉它指针是一个int,而不是。大多数编译器给出了正确的警告标志(我们应该始终使用)将为此提供警告,例如
gcc
在使用
-Wall
时提供以下警告:

warning: format '%d' expects argument of type 'int', but argument 2 has type 'char *' [-Wformat=]
printf("%d %d %d", "%da", 'a', 'A'); 
^
clang
默认情况下提供类似的警告

作为参考,告诉我们字符串文字是第
6.4.5节
string literals:

[…]初始化字符的静态存储持续时间数组[…] 字符串文本,数组元素的类型为char,并且 使用多字节字符的各个字节初始化 序列[……]

6.3.2.1节
左值、数组和函数指示符中介绍了指针的衰减:

[…]将具有类型“”的数组“”的表达式转换为 类型为“指向类型的指针”且指向初始值的表达式 数组的元素[…]

我们从fprintf函数的
7.19.6.1节中得到未定义的行为:

[…]如果任何参数不是对应的 转换规范,行为未定义


“这背后一定有某种算法/逻辑。”不,没有。如果你横穿马路而不朝两边看,会发生什么?谁知道呢。你可能会被车撞到。你可能会被卡车撞到。任何事情都有可能发生。如果你以特别禁止的方式处理信息,你会得到完全的垃圾。!!!你是干什么的?语言规范的步行索引?我只是好奇,如果你读过所有这些C变体的正式规范吗?@Mahesha999不,我知道的足够多,可以回答一些问题,如果不了解标准,这些问题是无法正确回答的。有很多SO用户非常了解标准,请查看,许多人比我更了解标准。好的,但是你还试过阅读这些C变体的正式语言语法吗?也许这会鼓励我。@Mahesha999嗯,语法是标准的一部分。例如,处理表达式、语句和声明的部分都包括形式语法。实际上,这是未定义的行为。在64位编译器上%d肯定不会打印字符串的地址,在其他编译器上可能不会。