printf(“%d”,“”)如何在C中工作?

我正在修改一些C概念并试过这个:

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

我可以理解,对于aA ,它打印ASCII值: 9765 。 但是我不明白为什么它打印"%da" 16079992 。 事实上,我不理解C在将它们输出为%d整数时如何解释字符串。 这背后必须有一些算法/逻辑。 任何人?

C中的字符串文字是char数组,在此上下文中将衰减为指向第一个元素的指针。

你所拥有的是未定义的行为,因为你错误地指定了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默认提供类似的警告。

作为参考, C99标准草案告诉我们字符串文字是6.4.5 字符串文字中的char数组:

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

6.3.2.1 左值,数组和函数指示符部分介绍了衰减到指针:

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

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

[…]如果任何参数不是相应转换规范的正确类型,则行为未定义。

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