采用int参数是否需要%c fprintf说明符

Vil*_*ray 2 c printf c99 variadic-functions language-lawyer

在C99标准的第7.19.6.1节第8 节中:

c如果不存在l长度修饰符,则将int参数转换为a unsigned char,并写入生成的字符.

在C99标准的第7.19.6.1节第9段中:

如果任何参数不是相应转换规范的正确类型,则行为未定义.

  • fprintf函数是否需要int参数?

例如,将unsigned int结果传递给未定义的行为:

unsigned int foo = 42;

fprintf(fp, "%c\n", foo); /* undefined behavior? */
Run Code Online (Sandbox Code Playgroud)

这让我很担心,因为实施可能被定义char为具有与unsigned char(第6.2.5段第15段)相同的行为.

对于这些情况,整数提升可能要求在某些实现中char提升unsigned int.因此,将以下代码留给那些实现的未定义行为风险:

char bar = 'B';

fprintf(fp, "%c\n", bar); /* possible undefined behavior? */
Run Code Online (Sandbox Code Playgroud)
  • int变量和字面int常量的值传递给唯一安全的方法fprintf%c符?

oua*_*uah 5

%c转换规范fprintf需要int参数.默认参数提升int后,该值必须是类型.

unsigned int foo = 42;
fprintf(fp, "%c\n", foo);
Run Code Online (Sandbox Code Playgroud)

未定义的行为:foo必须是一个int.

char bar = 'B';
fprintf(fp, "%c\n", bar);
Run Code Online (Sandbox Code Playgroud)

未定义的行为:bar被提升(默认参数提升)intfprintf可变参数函数.

编辑:公平地说,仍有一些非常罕见的实现,它可能是未定义的行为.例如,如果char是无符号类型,并且所有char值都不可表示int(如此实现中),则执行默认参数提升unsigned int.