【发布时间】:2012-10-01 13:21:13
【问题描述】:
就printf这个函数而言,我从一些参考资料和实验中了解到以下内容。
- 当我们尝试使用 用于浮点(或)双精度的格式说明符打印整数值时,反之亦然,行为是不可预测的。
- 但可以使用
%c打印整数值的等效字符。也可以使用%d打印字符的 ASCII 值(整数表示)。
同样,scanf 的行为是什么,如果 格式说明符和传递给 scanf 的参数不匹配。标准有定义吗?
【问题讨论】:
就printf这个函数而言,我从一些参考资料和实验中了解到以下内容。
%c 打印整数值的等效字符。也可以使用%d 打印字符的 ASCII 值(整数表示)。 同样,scanf 的行为是什么,如果 格式说明符和传递给 scanf 的参数不匹配。标准有定义吗?
【问题讨论】:
可变参数(与省略号 ... 匹配的参数)是默认提升的。这意味着所有较短的整数类型都被提升为int(或无符号,视情况而定)。整数和字符之间没有区别 (I believe)。 printf 中的%d 和%c 之间的区别仅仅是值的格式。
scanf 是一壶不同的鱼。您传递的所有参数都是指针。指针之间没有默认提升,传递与指针类型匹配的确切格式说明符至关重要。
在任何一种情况下,如果您的格式说明符与提供的参数不匹配(例如,将int * 传递给printf 中的%p),结果是未定义的行为,即比“不可预测”要糟糕得多——这意味着您的程序只是格式错误。
【讨论】:
int* 传递给 %p”可能不是最有教益的例子,因为很多 C 程序员都认为它是正确的。最好先使用一个更明显错误的示例(例如 int* 到 %f),然后可能包含将 int* 传递到 %p 的信息在技术上也是不正确的。
void* 和int* 不兼容并且让其他人感到困惑的开发人员。
int 传递给%c 特别感兴趣。那是UB吗?