printf在传递较少参数时的行为

时间:2013-02-12 17:41:35

标签: c printf

我刚刚注意到printf函数的不同行为是通过改变no来实现的。参数和格式说明符。请查看以下代码:

#include<stdio.h>
void main()
{ int ji=65;
  printf("ji>=65 ? %d : %c",ji);
 }

输出结果为 ji> = 65? 65:A
打印的字符为A
但如果代码是:

#include<stdio.h>
void main()
{ int ji=65,y;
  printf("ji>=65 ? %d : %c",ji);
  printf("%d",y)
}

在这种情况下打印的字符是 heart(ascii value 3) y 的值 12803

编译器如何获取字符值???请帮忙

3 个答案:

答案 0 :(得分:9)

在发布的代码中调用printf()会导致未定义的行为:

printf("ji>=65 ? %d : %c",ji); /* One less argument than required for
                                  the supplied format. */

来自 7.19.6.1 C99标准的fprintf函数部分:

  

fprintf函数在由format指向的字符串的控制下将输出写入stream指向的流,该格式指定后续参数如何转换为输出。 如果格式的参数不足,则行为未定义。如果参数保留时格式已用尽,则会评估多余的参数(一如既往),否则将被忽略。当遇到格式字符串的末尾时,fprintf函数返回。

此行为也适用于printf()函数(以及sprintf()snprintf()函数)。

答案 1 :(得分:0)

它是从堆栈中取出的。你告诉printf它可以从栈中获取2个参数但你只提供1个参数。 Printf不知道这个并且在堆栈上获取下一个值,这很可能是在调用printf期间保存的寄存器的值。

但请注意:您获得的值始终未定义。

答案 2 :(得分:0)

如果传递给printf的参数数量少于格式字符串中的转换说明符数,或者参数的类型对于相应的转换说明符不正确,则行为为< em> undefined ,意味着几乎任何结果都是可能的(并且被认为是“正确的”)。 获得的结果因情况而异。

如果传递给printf的参数数量大于转换说明符数,则会计算其他参数,否则会被忽略。

请注意,像y这样的块范围变量不会隐式初始化为任何特定值;它们的值是 indeterminate ,甚至可能是陷阱值,因此您不应期望第二个printf语句的任何特定输出。

此外,除非您的编译器文档显式将其列为有效签名,否则void main()也会导致未定义的行为。请改用int main(void)