如果我需要打印整数,如果我使用%f而不是%d会发生什么?或%ld而不是%d。我是否必须使用与真实数据相同的打印格式?
谢谢, 扎克
答案 0 :(得分:7)
是的,说明符和数据必须匹配未定义行为的惩罚。
引自C99标准:
如果任何参数不是相应转换规范的正确类型,则行为未定义。
答案 1 :(得分:1)
您将调用未定义的行为。
http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_083.html
(c11,7.1.4p1)"如果函数的参数具有[...]或类型(提升后),具有可变参数个数的函数不期望,则行为未定义。 #34;
答案 2 :(得分:0)
格式说明符和参数类型必须匹配,否则行为是未定义的(意味着从垃圾输出到恶魔飞出你的鼻子)。
格式说明符不仅告诉printf
如何格式化输出;它告诉函数参数的类型是什么。 printf
是一个可变函数,因此它不知道提前输入的参数的类型(第一个参数除外,它总是const char * restrict
)。剩下的参数只是堆栈上的一个字节墙。每个转换说明符告诉printf
每个参数有多大(即1字节char
,或2字节short
,或4字节float
等。)因此它可以获取正确大小的内存块并正确解释它。