【发布时间】:2013-07-26 20:36:12
【问题描述】:
在 C99 标准的 第 7.19.6.1 节第 8 段中:
c如果不存在l长度修饰符,则int参数将转换为unsigned char,然后写入生成的字符。
在 C99 标准的 第 7.19.6.1 节第 9 段中:
如果任何参数不是相应转换规范的正确类型,则行为未定义。
-
fprintf函数是否需要int参数?
例如,传递unsigned int 会导致未定义的行为:
unsigned int foo = 42;
fprintf(fp, "%c\n", foo); /* undefined behavior? */
这让我很担心,因为实现可以将 char 定义为与 unsigned char 具有相同的行为(第 6.2.5 节第 15 段)。
对于这些情况,整数提升可能会规定 char 为 promoted to unsigned int on some implementations。因此,让以下代码冒着在这些实现上出现未定义行为的风险:
char bar = 'B';
fprintf(fp, "%c\n", bar); /* possible undefined behavior? */
-
int变量和文字int常量是使用%c说明符将值传递给fprintf的唯一安全方法吗?
【问题讨论】:
-
你总是可以写
fprintf(fp, "%c\n", 'B');。 -
啊,是的,我忘了字符常量在 C 中是
int类型的,不是吗?
标签: c c99 language-lawyer printf variadic-functions