C语言面试题----printf()的参数

作者: 安想创新教育 | 来源:发表于2017-12-21 11:31 被阅读11次

版权声明:本文转载于公众号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;

}

答案:13.49

对于格式化输出控制字符串来说,%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;

}

输出的结果就是:670084616

而且这个值有时候运行起来是不不一样的。

原因在于,printf并不会进行自动类型转换,printf后边的变量以栈的方式存储,

而%f、%d等转换说明符的操作方式是从栈中读取该符号对应数据类型的字节数,

并不关心后边对应的数据类型 具体是什什么。

因为在内存中,浮点数是以指数幂的形式进行存储的,

所以如果直接读取内存中数据按照十进制 显示出来的话,

就会出现这样的情况。

为了保证正确输出,可以在输出前转换数据类型,

这样就不会有问题!如:

#include

int main()

{

    //类型不不符的输出

    float num = 13.48932f;

    printf("%d\n",(int)num);

    return 0;

}

输出结果就是:13

总结一下,printf语句一定要注意输出格式和变量类型的匹配,不然会出现莫名其妙的错误。

相关文章

  • C语言面试题----printf()的参数

    版权声明:本文转载于公众号TeachPlus---C语言面试题---printf()的参数 问:下面代码会输出什么...

  • 格式化字符串绕过canary入门

    知识 格式化字符串漏洞是因为c语言中printf的参数个数不是确定的,参数的长度也不是确定的,当printf把我们...

  • C语言的可变参数

    C语言中有些函数使用可变参数,比如常见的int printf( const char* format, ...),...

  • va_list 可变长参数原理

    在 c 语言中,我们可以使用可变参数来传入多个参数,比如 printf 函数。可变参数的函数需至少定义一个参数值,...

  • python函数参数

    python函数的参数是目前见过最复杂的参数了。 C语言里用的最多的可变参数函数就是scanf和printf了,j...

  • #define DM9000_DBG(fmt,args...)

    标准C支持可变参数的函数,意味着函数的参数是不固定的,例如printf()函数的原型为:int printf( c...

  • 可变参数在宏定义中的应用

    在C语言的标准库中,printf、scanf、sscanf、sprintf这些标准库的输入输出函数,参数都是可变的...

  • 【C】变长参数&stdarg相应宏实现

    简述C语言变长参数及stdarg里的相应宏实现,以printf()函数为例,其参数个数和类型都是不定的,是如何保证...

  • C++11新特性--不定参数模板与std::tuple、std:

    不定参数函数     学过C语言的人应该都用过printf这个库函数,它的声明如下:     它的第一个参数是一个...

  • Go 格式化输出fmt.Printf

    类似于C或其它语言里的printf函数,fmt.Printf函数对一些表达式产生格式化输出。该函数的首个参数是个格...

网友评论

    本文标题:C语言面试题----printf()的参数

    本文链接:https://www.haomeiwen.com/subject/atnowxtx.html