根据C标准(6.5.2.2第6段)
如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,而浮点类型的参数将提升为双精度。这些称为默认参数提升。如果参数的数量不等于参数的数量,则行为未定义。如果函数定义为包含原型的类型,并且原型以省略号 (, ...) 结尾,或者提升后的参数类型与参数类型不兼容,则行为未定义。如果函数定义的类型不包含原型,并且提升后的参数类型与提升后的参数类型不兼容,则行为未定义,但以下情况除外:
- 一种提升类型是有符号整数类型,另一种提升类型是对应的无符号整数类型,并且值可以在两种类型中表示;
- 这两种类型都是指向字符类型或 void 的限定或非限定版本的指针。
因此,一般来说,只要传递的值适合这两种类型,将 an 传递int
给期望 an unsigned int
(反之亦然)的可变参数函数没有任何问题。但是,printf
阅读规范(7.19.6.1 第 9 段):
如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。
有符号/无符号不匹配也不例外。
这是否意味着printf("%x", 1)
调用未定义的行为?