printf(“%d”,“”)如何在C中工作?
我正在修改一些C概念并试过这个:
printf("%d %d %d", "%da", 'a', 'A'); //16079992 97 65
我可以理解,对于a
和A
,它打印ASCII值: 97
和65
。 但是我不明白为什么它打印"%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.1
节fprintf函数得到未定义的行为:
[…]如果任何参数不是相应转换规范的正确类型,则行为未定义。
C中的字符串是一个指针,它有一个数值(地址)。 所以printf只是在那里打印字符串的地址。