在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 >= ) &&(curtm->tm_hour < );
// 如果状态发生了变化,也就是原有状态(lastoff)
// 和现在应有的状态(off)不同(用“!=”符号判断)
// 则调用sw()函数,根据现在的新状态off关灯或者开灯
if(off != lastoff)
{
// 因为sw()函数接受的是表示开灯与否的逻辑变量,
// 刚好与我们这里计算的表示关灯与否的逻辑变量off相反,
// 所以我们这里使用逻辑运算符“!”对off进行取反运算,
// 正好得到表示开灯与否的逻辑量
sw(!off);
// 将现在的状态off保存为新的原有状态
lastoff = off;
}
// 调用Sleep()函数(Windows API),
// 让程序休眠10分钟后,继续下一次检查
Sleep(**);
}
return ;
}

在这段程序中,我们使用了<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这两个关键字来表示逻辑上的真和假。

C逻辑型变量——时控灯例子的更多相关文章

  1. (转)C语言16进制输出字符型变量问题

    最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char  ...

  2. C语言中以十六进制输出字符型变量会出现'ffffff"的问题

    最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char  ...

  3. Arduino 极速入门系列 - 光控灯(1)- 关于理论和 LED 那些事

    点个 LED 闪亮好像太单调,这次来个光控 LED 灯.这个其实不需要 Arduino 也能做,这次只是用来演示一下 PWM 在 Arduino 里面的做法.PWM 原理后面会解释.这次用充电宝提供 ...

  4. Java中数据类型转换&基本类型变量和对象型变量

    1.Java的数据类型分为三大类 布尔型,字符型和数值型 其中数值型又分为整型和浮点型 2.Java的变量类型 布尔型 boolean 字符型 char 整型    byte,short,int,lo ...

  5. seaborn 数据可视化(一)连续型变量可视化

    一.综述 Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,图像也更加美观,本文基于seaborn官方API还有自己的一些理解.   1.1.样式控制: ...

  6. python中将函数赋值给变量时需要注意的一些问题

    python中将函数赋值给变量时需要注意的一些问题 变量赋值是我们在日常开发中经常会遇到的一个问题,本文主要给大家介绍的是关于python将函数赋值给变量时需要注意的一些问题,分享出来供大家参考学习, ...

  7. volatile型变量语义讲解一 :对所有线程的可见性

    volatile型变量语义讲解一 :对所有线程的可见性 一.volatile变量语义一的概念 当一个变量被定义成volatile之后,具备两个特性: 特性一:保证此变量对所有线程的可见性.这里的&qu ...

  8. bool型变量下标的时候javascript是不能允许的

    jother编码是我最开始想写的内容,原因有两点:1.原理比较简单,不需要太多关于算法的知识.2.比较有趣,是在对javascript有了很深的理解之后催生的产物.如果你只需要知道jother编码和解 ...

  9. 连续型变量的推断性分析——t检验

    连续型变量的推断性分析方法主要有t检验和方差分析两种,这两种方法可以解决一些实际的分析问题,下面我们分别来介绍一下这两种方法 一.t检验(Student's t test) t检验也称student ...

随机推荐

  1. 通过find命令寻找文件并拷贝到一个指定目录方法详解

    有这样的一个需求,需要将一部分符合条件的文件从一个目录拷贝到另一个目录中,可以通过使用find命令从源目录查找到符合条件的文件然后使用cp命令拷贝到目标目录   将通过find命令找到的文件拷贝到一个 ...

  2. SQL Server 2008 没有可用于 charge_sys_Log.LDF 的编辑器

    因为上网问题重新装了系统.今天在整 SQL Server  的时候出现了这样一个问题. 因为之前装 SQL Server  的时候没有遇到过这种情况,感觉很新奇.所以详细的记录一下,希望对别人能有一定 ...

  3. 20145120 《Java程序设计》实验三实验报告

    20145120 <Java程序设计>实验三实验报告 实验名称:敏捷开发与XP实践 实验目的与要求: XP基础 XP核心实践 相关工具 (一)敏捷开发与XP 极限编程(eXtreme Pr ...

  4. 团队项目的NABC

    我们团队项目是做一个基于PC端的截屏软件,我觉得一个好的截屏软件需要具备磁性吸附的功能.当你需要对某个图像或者是其他的什么截屏的时候,精度比较高,不需要那些边框外的东西,磁性吸附就是在你选中的时候尽管 ...

  5. Write operations are not allowed in read-only mode (FlushMode.NEVER/

    今天在做ssh项目开发的时候遇到一个问题,保存数据的时候报错: Write operations are not allowed in read-only mode (FlushMode.NEVER/ ...

  6. Netsharp快速入门(之1) 介绍及需求说明

    作者:秋时 杨昶   时间:2014-02-15  转载须说明出处 第一章 快速入门介绍 Netsharp是一个企业基础业务管理平台,介绍Netsharp分三个系列,分别是: 1.         N ...

  7. selenium--嵌套frame定位

    网页源码: 案例1 :iframe有id.name属性 网页上有3个frame:header.menu.main,分别代码顶部.左侧.右侧(其中menu.main在另外一个frameset中) 如何定 ...

  8. JavaScript的DOM操作(1)

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Window对象操作 一.属性和方法: 属性(值或者子对象): op ...

  9. java加载机制整理

    本文是根据李刚的<疯狂讲义>作的笔记,程序有的地方做了修改,特别是路径,一直在混淆,浪费了好多时间!!希望懂的同学能够指导本人,感激尽............ 1.jvm 和 类的关系 当 ...

  10. 2012 Asia Chengdu Regional Contest

    Browsing History http://acm.hdu.edu.cn/showproblem.php?pid=4464 签到 #include<cstdio> #include&l ...