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

时间:2014-08-04 12:23:45

标签: c string int printf

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

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

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

2 个答案:

答案 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只是在那里打印字符串的地址。