C逻辑型变量——时控灯例子
2013-11-05 17:28 kingshow 阅读(1081) 评论(0) 编辑 收藏 举报在C99标准颁布之前,我们通常都是用1或者0来表示逻辑的真与假,因此,当我们需要在程序中传递这种逻辑数据时,我们都是用整型数据类型int来表示这种逻辑型数据。然而,使用整型数据类型int来表示逻辑型变量,往往带来很多问题。例如,整型数据具有加减乘除的算术运算,然而这些运算对于逻辑型变量是没有意义的;整型变量可以有多个值,而逻辑型变量应该只有真或者假两个值,这就使得用整型数据类型来表示逻辑型变量,往往会产生歧义。 为了解决这些问题,同时与C++保持兼容,C99标准专门在头文件中预先定义了一个宏bool来表示逻辑型变量(最终编译的时候,bool会被替换成真正的逻辑型数据类型_Bool)。
用bool定义的逻辑型变量只有两个值,true和false,分别对应于逻辑的真和假。我们可以将一个条件表达式的值赋值给一个bool类型的变量,用于在程序中传递逻辑型的数据。例如:
#include <stdio.h> // 引入bool类型所在的头文件 #include <stdbool.h> // 引入时间函数所在的头文件 #include <time.h> // 引入Sleep()函数所在的头文件 #include <Windows.h> // 电灯开关函数,根据传入的bool类型参数,输出相应的字符串 void sw(bool on) { // 这里的bool类型的on就是表示电灯开关与否的逻辑型变量 if(on) { puts("turn on the light"); } else { puts("turn off the light"); } // 主函数,获取当前时间,控制电灯的开关 int main() { // 定义一个struct tm结构体类型的指针,用于指向当前时间 // 其中,struct tm是定义在time.h中的结构体类型,这里我们 // 可以简单地将其当作表示时间(年、月、日等等)的数据类型 struct tm* curtm; // 使用一个bool类型的变量记录原有状态 bool lastoff = true; // 默认处于关灯状态 // 构造一个无限循环,全年无休地检查是否该开灯还是关灯 while(true) { // 利用time()函数获取当前系统时间 // 它的参数为一个指向time_t类型变量的指针,函数的执行结果将保存 // 在这个变量中。如果参数为NULL,则表示获取的结果将通过返回值返回 time_t t = time(NULL); // 将当前时间转换为本地时间格式 curtm = localtime( &t ); // 利用逻辑表达式, // 判断当前时间是否在关灯时间范围(7:00——20:00)内 bool off = (curtm->tm_hour >= 7) &&(curtm->tm_hour < 20); // 如果状态发生了变化,也就是原有状态(lastoff) // 和现在应有的状态(off)不同(用“!=”符号判断) // 则调用sw()函数,根据现在的新状态off关灯或者开灯 if(off != lastoff) { // 因为sw()函数接受的是表示开灯与否的逻辑变量, // 刚好与我们这里计算的表示关灯与否的逻辑变量off相反, // 所以我们这里使用逻辑运算符“!”对off进行取反运算, // 正好得到表示开灯与否的逻辑量 sw(!off); // 将现在的状态off保存为新的原有状态 lastoff = off; } // 调用Sleep()函数(Windows API), // 让程序休眠10分钟后,继续下一次检查 Sleep(1000*60*10); } return 0; }
在这段程序中,我们使用了<stdbool.h>头文件中定义的bool宏来表示逻辑型变量,它可以很方便地在程序中传递,就像传递一个普通变量一样。另外,我们还可以直接使用逻辑运算符,直接对bool类型的变量进行运算,方便了我们对于逻辑型变量的处理。另外,这个头文件中定义的表示逻辑真假状态的预定义宏true和false的使用,可以让我们的程序更具可读性。显然,我们这里使用的“while(true)”比我们以往使用的“while(1)”更能表达程序的意义,更具可读性。
此外,这个例子还展示了C语言中时间函数的使用。time()函数获得了当前时间,而localtime()函数可以将它转换为本地时间,这样便于我们用它与我们设定的关灯时间范围(7:00——20:00)进行比较,从而获得一个逻辑型变量off,它记录了当前时间是否应该关灯的逻辑判断结果。然而,sw()函数需要的是表示开灯与否的逻辑判断,而这两者刚好相反,于是我们将off直接用逻辑运算符“!”取反,就得到了表示开灯与否的逻辑判断。然后,我们将这个逻辑运算结果直接传递给sw()函数,sw()函数会根据这个逻辑型变量的值输出相应的文字。
从这里我们也可以看到,bool类型的使用,避免了使用整型int表示逻辑型变量可能带来的误解和麻烦,使得整个程序更加清晰,所以在以后的编程实践中,我们应当与没有明确意义的1和0说拜拜,使用bool类型来表示逻辑型变量,使用true和false这两个关键字来表示逻辑上的真和假。