c: bool

本文详细介绍了C语言中布尔类型的演变历史,从早期的自定义枚举和宏定义到C99标准引入的_Bool类型,以及如何通过stdbool.h头文件与C++保持兼容。文章还提供了示例代码,展示了_Bool类型的使用方法。

有人说c语言中没有bool类型,只有c++中有,果真如此?

1 先看没有bool类型时,c中表示bool类型的方法:

typedef int bool;
#define false 0
#define true 1
2、

typedef int bool;
enum { false, true };
3、

typedef enum { false, true }bool;


也许很多人都和我一样,不知道现在的C语言已经有了布尔型:从C99标准开始,类型名字为“_Bool”。

    在此之前的C语言中,使用整型int来表示真假。在输入时:使用非零值表示真;零值表示假。在输出时:真的结果是1,假的结果是0;(这里我所说的“输入”,意思是:当在一个需要布尔值的地方,也就是其它类型转化为布尔类型时,比如 if 条件判断中的的条件;“输出”的意思是:程序的逻辑表达式返回的结果,也就是布尔类型转化为其他类型时,比如 a==b的返回结果,只有0和1两种可能)。

    所以,现在只要你的编译器支持C99(我使用的是Dev C++4.9.9.2),你就可以直接使用布尔型了。另外,C99为了让C和C++兼容,增加了一个头文件stdbool.h。里面定义了bool、true、false,让我们可以像C++一样的定义布尔类型。
  1. 我们自己定义的“仿布尔型”
    在C99标准被支持之前,我们常常自己模仿定义布尔型,方式有很多种,常见的有下面两种:

/* 第一种方法 */
#define TRUE 1
#define FALSE 0

/* 第二种方法 */
enum bool{false, true};
2. 使用_Bool
现在,我们可以简单的使用 _Bool 来定义布尔型变量。_Bool类型长度为1,只能取值范围为0或1。将任意非零值赋值给_Bool类型,都会先转换为1,表示真。将零值赋值给_Bool类型,结果为0,表示假。 下面是一个例子程序。

#include <stdio.h>
#include <stdlib.h>

int main(){
_Bool a = 1;
_Bool b = 2; /* 使用非零值,b的值为1 /
_Bool c = 0;
_Bool d = -1; /
使用非零值,d的值为1 */

printf("a==%d,  /n", a);
printf("b==%d,  /n", b);
printf("c==%d,  /n", c);
printf("d==%d,  /n", d);

printf("sizeof(_Bool) == %d  /n", sizeof(_Bool));

system("pause");
return EXIT_SUCCESS;

}
运行结果如下:(只有0和1两种取值)

a1,
b
1,
c0,
d
1,
sizeof(_Bool) == 1
3. 使用stdbool.h
在C++中,通过bool来定义布尔变量,通过true和false对布尔变量进行赋值。C99为了让我们能够写出与C++兼容的代码,添加了一个头文件<stdbool.h>。在gcc中,这个头文件的源码如下:(注,为了清楚,不重要的注释部分已经省略)

/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
        This file is part of GCC.
 */
 
#ifndef _STDBOOL_H
#define _STDBOOL_H
 
#ifndef __cplusplus
 
#define bool	_Bool
#define true	1
#define false	0
 
#else /* __cplusplus ,应用于C++里,这里不用处理它*/
 
/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool	bool
#define bool	bool
#define false	false
#define true	true
 
#endif /* __cplusplus */
 
/* Signal that all the definitions are present.  */
#define __bool_true_false_are_defined	1
 
#endif	/* stdbool.h */
下面我提供我的主程序调用 // IO // 输入 iSensor_A_Entry AT %IX1.5 : BOOL; //SENSOR 14 iSensor_A_Exit AT %IX0.4 : BOOL; //SENSOR 5 iSensor_L1_High AT %IX3.0 : BOOL; // L1 上 iSensor_L1_Low AT %IX3.1 : BOOL; // L1 下 iSensor_L1_Object AT %IX0.5 : BOOL; //SENSOR 6 iSensor_B_Entry AT %IX0.3 : BOOL; //SENSOR 4 iSensor_B_Exit AT %IX1.4 : BOOL; //SENSOR 13 iSensor_L2_High AT %IX3.3 : BOOL; // L2 上 iSensor_L2_Low AT %IX3.4 : BOOL; // L2 下 iSensor_L2_Object AT %IX0.0 : BOOL; //SENSOR 1 iSensor_C_Entry AT %IX1.1 : BOOL; //SENSOR 10 iSensor_C_Exit AT %IX1.3 : BOOL; //SENSOR 12 iSensor_D_Entry AT %IX1.0 : BOOL; //SENSOR 9 iSensor_D_Exit AT %IX1.2 : BOOL; //SENSOR 11 iSensor_L1_Left AT %MX0.5 : BOOL; iEmergencyStop AT %MX0.2 : BOOL; // 输出 // A B C D 顺 //从近道远 ABCD AD AB AC 路径 逆转 qMotor_A_Fwd AT %QX2.6: BOOL; // M3 顺 qMotor_B_Fwd AT %QX3.2: BOOL; // M4 顺 qMotor_C_Fwd AT %QX2.4: BOOL; // M2 顺 qMotor_D_Fwd AT %QX2.0: BOOL; // M1 顺 // A B C D 逆 qMotor_A_Rev AT %QX2.7: BOOL; // M3 逆 qMotor_B_Rev AT %QX3.1: BOOL; // M4 逆 qMotor_C_Rev AT %QX2.3: BOOL; // M2 逆 qMotor_D_Rev AT %QX2.1: BOOL; // M1 逆 // L1 电机 qLifter1_Up AT %QX0.1: BOOL; // L1 升降启停 qLifter1_Down AT %QX0.1: BOOL; // L1 升降启停 qLifter1_MFwd AT %QX0.0: BOOL; // L1 顺 qLifter1_MRev AT %QX0.2: BOOL; // L1 逆 // L2 电机 qLifter2_Up AT %QX0.5: BOOL; // L2 升降启停 qLifter2_Down AT %QX0.5: BOOL; // L2 升降启停 qLifter2_MFwd AT %QX0.3: BOOL; // L2 顺 qLifter2_MRev AT %QX0.4: BOOL; // L2 逆 // HMI hmiStart_AtoC AT%MX7.2: BOOL := FALSE; hmiDelay_Lifter1 : TIME := T#0MS; hmiStatus : STRING(20); // 设备实例 RollerA: FB_Roller; RollerB: FB_Roller; RollerC: FB_Roller; RollerD: FB_Roller; Lifter1: FB_Lifter; Lifter2: FB_Lifter; PathCtrl: FB_PathController; tDelay: TIME := T#0S; // 原始延时时间 sDisplay: STRING(20); // 显示字符串 END_VAR // 设备实例 // 辊道初始 RollerA( bEntrySensor := iSensor_A_Entry, bExitSensor := iSensor_A_Exit, bEmergencyStop := iEmergencyStop ); // 顶升机初始化 Lifter1( bHighSensor := iSensor_L1_High, bLowSensor := iSensor_L1_Low, // bObjectPresent := iSensor_L1_Object, bObjectLeft := iSensor_L1_Left, bEmergencyStop := iEmergencyStop, ); // 路径控制器 PathCtrl( bStart_AtoC := hmiStart_AtoC, tDelay_Lifter1 := hmiDelay_Lifter1, refRollerA := RollerA, refRollerC := RollerC, refLifter1 := Lifter1 ); // 输出映射 qMotor_A_Fwd := RollerA.bMotorForward; qMotor_A_Rev := RollerA.bMotorReverse; qLifter1_Up := Lifter1.bLiftMotorUp; qLifter1_Down := Lifter1.bLiftMotorDown; qLifter1_MFwd := Lifter1.bBeltReverse; qLifter1_MRev := Lifter1.bBeltForward; // HMI状态反馈 hmiStatus := PathCtrl.sStatus;
最新发布
11-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值