C连载14-精准数据类型、参数数量类型匹配、缓冲区的原理

一、使用数据类型的雷区

  • 不要赋值给不相关的变量
  • 例如:int a = 2.36这条语句,会直接给a赋值2,而不会进行四舍五入,原理是直接截断小数点后面的数字。
  • 例如:float b = 3.1415926536,C中保证了float类型的前6位精度,会损失精度,应该使用double来进行赋值。
  • 许多公司内部会在变量名中体现变量类型,例如:int类型的一般用i_当前缀,unsigned short会使用us_当前缀。

二、参数与陷阱

  • C语言会通过函数原型机制检查函数调用时参数的个数和类型是否正确,但是printf()scan()不起作用,因为这两个函数的参数是可变的。
#include
int D14_1_badcount(void) {
 int n = 4;
 int m = 5;
 float f = 7.0f;
 float g = 8.0f;

 printf("%d\n", n, m);
 printf("%d %d %d\n", n);
 printf("%d %d\n", f, g);

 return 0;
}

运行结果: 14.1

  • 如上运行结果,第一个printf只打印出来一个参数,后面的参数没有打印出来;第二个printf第一个显示对了,但是后面两个因为没有给出参数的取值,因此计算机就随机的娴熟出来数据;第三个printf因为类型匹配不上,因此也是随即打印了两个数字。float类型不会自动转化为int类型。

三、转义序列示例

#include
#pragma warning(disable:4996)

int D14_2_escape(void) {
 float salary;
 printf("\aEnter your desired monthly salary:");
 printf("$___________\b\b\b\b\b\b\b\b");
 scanf("%f", &salary);
 printf("\n\t$%.2f a month is %0.2f a year", salary, salary * 12.0);
 printf("\rGee!\n");

 return 0;
}

运行结果: 14.2

  • \a表示一声计算机警报
  • 第二条打印语句,就是让光标向前移动8个下划线(因为有8个\b),然后在这里键入数字即可;
  • 第三条语句,先换行,再来一个tab制表符,然后打印那句话;
  • 第四条语句,\r代表先回到这一行的首部,然后打印Gee!最后光标落在下一行

三、属性输出

1.printf什么时候把输出发送到屏幕呢?

  • 最初,先发送到缓冲区(buffer)的中间存储区域,然后缓冲区的内容在不断的被发送到屏幕上。
  • 什么时候发送到屏幕呢?C语言规定:当缓冲区满、遇到换行符或者需要输入的时候

从缓冲区把数据发送到屏幕或者文件被称为刷新缓冲区。

  • 旧式编译器遇到scanf函数也不会刷新缓冲区
  • 所以有时经常写\n也是一种习惯。

小结:
(1)C语言支持混合数据类型表达式,但是会进行自动类型转换。
(2)_Bool是一种无符号类型;

三、源码:

    • D14_1_badcount.c
    • D14_2_escape.c
    • https://github.com/ruigege66/CPrimerPlus/blob/master/D14_1_badcount.c
    • https://github.com/ruigege66/CPrimerPlus/blob/master/D14_2_escape.c
    • CSDN:https://blog.csdn.net/weixin_44630050
    • 博客园:https://www.cnblogs.com/ruigege0000/
    • 欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流,后台回复“礼包”获取Java大数据学习视频礼包
      20.4

你可能感兴趣的:(C连载14-精准数据类型、参数数量类型匹配、缓冲区的原理)