我正在修改一些C概念并尝试过这个:
printf("%d %d %d", "%da", 'a', 'A'); //16079992 97 65
我可以理解,对于a
和A
,它会输出ASCII值:97
和65
。但是我无法理解为什么它为16079992
打印"%da"
。事实上,我不理解C在将字符串输出为%d
的整数时如何解释字符串。这背后必须有一些算法/逻辑。任何人吗?
答案 0 :(得分:6)
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
默认情况下会提供类似的警告。
作为参考,draft C99 standard告诉我们字符串文字是6.4.5
字符串文字部分中的char数组:
[...]初始化一个静态存储持续时间数组[...]用于字符 字符串文字,数组元素的类型为char,并且是 使用多字节字符的各个字节初始化 序列; [...]
Layues,数组和函数指示符中包含
衰减到指针:
[...]具有类型''数组类型''的表达式转换为 带有''指向类型'的指针的表达式,指向初始值 数组元素[...]
我们从6.3.2.1
部分得到未定义的行为fprintf函数:
[...]如果任何参数不是相应的正确类型 转换规范,行为未定义。
答案 1 :(得分:1)
C中的字符串是一个指针,它有一个数值(地址)。所以printf只是在那里打印字符串的地址。