C语言面试题----printf()的参数
版权声明:本文转载于公众号TeachPlus---C语言面试题---printf()的参数
int main(void)
{
int a = 10,b=20,c=30;
printf("\n%d..%d..%d \n",a+b+c,(b=b*2),(c=c*2));
return 0;
}
本题解析
110..40..60
这道题目来说的话,许多同学感觉无从下手,所以没法回答。
或者是有同学会认为是60..40..60这样的答案,那么需要注意的是,
对于c语言来说,printf函数输出虽然是自左向右输出,但是计算的话,却是从右向左计算的。
也就是先计算c = c* 2的结果,再计算b = b * 2的结果,最后计算a + b + c 的结果。
但是强烈烈建议,大家不不要再printf函数中像这样去写,
因为这样会增加代码阅读的困难度,有可能会让你的同事阅读你的代码的时候压制不住心中打你的冲动。
相关知识点
对于printf函数,考点还是非常多的,比如说浮点数的输出,或者类型不符的输出
浮点数
如下程序,将会输出什么结果?
#include int main()
{
float num = 13.48932f;
printf("%2.2f\n",num);
return 0;
}
对于格式化输出控制字符串来说,%2.2f,小数点后的2代表小数点后保留的位数,
需要注意的是,这里的保留时采用四舍五入的。
小数点前的2代表输出的总宽度,包含小数点在内,
但是如果不能够将有效的数据完全输出来 的话,则不起作用的
在本例中,浮点数13.48932,小数点后面保留两位,是13.49,
输出位共5位,所以小数点前的2是不起作用的。
所谓类型不符的输出,就是前面的格式化控制字符串中声明的数据类型,
与实参给出的数据类型不匹配的情形
如:
int a =20;
printf("%s\n",a);
对于类型不符的输出的处理,其实是比较复杂的;
如上例中的输出如果换做下面的形式:
#include
int main()
{
float num = 13.48932f;
printf("%d\n",num);
return 0;
}
而且这个值有时候运行起来是不不一样的。
原因在于,printf并不会进行自动类型转换,printf后边的变量以栈的方式存储,
而%f、%d等转换说明符的操作方式是从栈中读取该符号对应数据类型的字节数,
并不关心后边对应的数据类型 具体是什什么。
因为在内存中,浮点数是以指数幂的形式进行存储的,
所以如果直接读取内存中数据按照十进制 显示出来的话,
就会出现这样的情况。
为了保证正确输出,可以在输出前转换数据类型,
这样就不会有问题!如:
#include
int main()
{
//类型不不符的输出
float num = 13.48932f;
printf("%d\n",(int)num);
return 0;
}
输出结果就是:13
总结一下,printf语句一定要注意输出格式和变量类型的匹配,不然会出现莫名其妙的错误。