我刚刚注意到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 。
编译器如何获取字符值???请帮忙
答案 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)
。