第8章 为什么程序员无法分清万圣节和圣诞节

类型转换

在表达式中,每个char和short都被转换为int,所有位于表达式中的float都被转换为double,任何数组被提升为相应类型的指针。由于函数参数也是一个表达式,所以当参数传递给函数时也会发生类型转换。这个特性被称为类型提升。这就是为什么printf()中的字符串%d能适用于short,int,char等几种不同类型。
另一个会发生隐式类型转换的地方就是参数传递。

在实际编程中,我们通过把函数原型放置在头文件中,而函数的定义则放置在另一个包含了该头文件的源文件中,这样编译器能同时它们,如有不匹配能检测到。

不需要回车就能获取一个字符

这种一次输入一个字符的特性对于许多种类的软件来说都是非常重要额,但对于PC而言却是小菜一碟。C语言支持这个特性,通常使用kbhit()函数,如果一个字符正在等待被读取,它就会发出提示。编译器还提供了getch()(或getche())函数,它可以使字符在读取的同时回显于屏幕上,来获取单个字符,而不用等待整行结束。
[kbhit()并没有被纳入标准库函数,使用其会导致程序可移植性变差。]

#include <sys.filio.h>
int kbhit()
{
	int i;
	ioctl(0, FIONREAD, &i);
	return i; // 返回可以读取的字符的计数值
}

还存在一种非轮询读取方式,每当操作系统准备好一些输入时,就会给你的进程发送一个信号。如果程序使用了中断驱动的I/O,当它不处理输入时可以在main函数里执行一些其他的处理。如果输入比较零散且程序还有许多其他事务要处理,这是一种非常有效的资源使用方式。中断驱动程序要复杂的多,使它正常运转的难度也大得多,但它可以使进程更有效地使用CPU时间,而不是白白浪费时间一直等待输入。现在,随着线程的进一步使用,人们对中断驱动I/O的使用也日益减少

用C语言实现有限状态机

有限状态机是一个数学概念,如果把它运用于程序中,可以发挥很大的作用。它是一种协议,用于有限数量的子程序(状态)的发展变化。每个子程序进行一些处理并选择下一种状态(通常取决于下一段输入)。
在C语言中,有好几种方法可以表示FSM,但它们绝大多数都是基于函数指针数组的。一个函数指针数组可以像下面这样声明:

void (*state[MAX_STATES])();
extern int a(), b(), c(), d();
int (*state[])() = {a, b, c, d}; // 初始化
(*state[i])(); // 函数调用

所有的函数必须接受同样的参数,并返回同种类型的返回值。
如果你的状态函数看上去需要多个不同的参数,可以考虑使用一个参数计数器和一个字符串指针数组,就像main函数的参数一样。我们熟悉的int argc, char *argv[]机制是非常普遍的,可以成功地应用在你所定义的函数中。

使软件更易于开发的一种方法是使用可调式性编码这意味着把系统分成几个部分,先让程序总体结构运行。只有基本的程序能够运行之后,你才为那些复杂的细节完善、性能调整和算法优化进行编码

强制类型转换

强制类型转换既用于类型转换,也用于消除类型歧义。如:

(float)3;
extern int printf(const char* arv);
void *f = (void*)printf;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值