tar*_*ish 2 c floating-point int type-conversion
int main()
{
int x,y;
int z;
char s='a';
x=10;y=4;
z = x/y;
printf("%d\n",s); //97
printf("%f",z); //some odd sequence
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,由于控件字符串中的int类型,char s在打印时自动转换为int,但在第二种情况下,int to float转换不会发生.为什么这样?
在这两种情况下,第二个参数都被提升为int.这就是可变函数的工作原理,与格式字符串无关.
格式化字符串甚至没有被编译器查看:它只是某个函数的参数.好吧,一个真正有用的编译器可能知道printf()并且可能会查看格式字符串,但只是为了警告您可能犯的错误.事实上,gcc就是这样:
t.c:9: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’
Run Code Online (Sandbox Code Playgroud)
最终您有责任确保可变参数与格式字符串匹配.由于在第二次printf()调用中它们没有,因此代码的行为是不确定的.