ddlovepp 发表于 2010-11-27 11:44:40

C语言 关于#define TRUE (1 == 1) 和#define FALSE (0 == 1)的问题

#define TRUE (1 == 1)
#define FALSE (0 == 1)
上面的(1 == 1)是1吗?? 上面的(0 == 1)是0吗???
#define TRUE (1 == 1) #define FALSE (0 == 1) 上面的(1 == 1)是1吗?? 上面的(0 == 1)是0吗??? 怎么理解?C语言没有布尔类型啊!!求救,谢谢。。
char allocated ;
allocated= TURE;
allocated = FALSE;
可以这么赋值吗???
答案是可以的,但为什么呢??能不能有启发点的解释下。。
希望经验丰富的C程序员回答下,谢谢

sharpufo 发表于 2010-11-27 11:55:26

allocated= (1==1) =条件判断式(1==1)的值 = 一个非零值.
allocated=(0==1)=条件判断式(0==1)的值 = 0.
一般上面的式子编译器都会优化成
allocated=非零值;和
allocated=0;
而不会真的再进行0和1的比较。

对于没有BOOL类型的C编译器,一般可以直接拿unsigned char(建议8位CPU) 或者unsigned int(32位cpu) 做BOOL类型,
可以这样定义
#define FALSE 0
#define TRUE (!FALSE)

typedef unsigned char BOOL;

BOOL bool_val=FALSE;

void fun(void)
{
.....
if(bool_val)....{bool_avl为真值时执行的代码}
else ....{为假值时执行的代码}
....
....
if( ! bool_val)....{条件为假值时执行的代码}
else ....{真值时执行的代码}

}

ddlovepp 发表于 2010-11-27 12:34:40

回复【1楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------

typedefchar Bool;
typedef unsigned char Bool;
typedef unsigned int Bool;
typedef int Bool;
都可以吧。
我去调试了一下
#include<stdio.h>

#define TURE (1==1)
#define FALSE (0==1)
typedef unsigned int Bool;


int main(void)
{
Bool a,b;
a = TURE;
b = FALSE;
printf("Ture is: %d\n False is: %d\n",a,b);
return 0;

}

只要printf("Ture is: %d\n False is: %d\n",a,b);
,typedefXXX Bool;XXX随便改
输出都是
Ture is: 1
False is:0

但是改成printf("Ture is: %f\n False is: %f\n",a,b);
输出的是
Ture is: 0.000000
False is:0.000000

或printf("Ture is: %s\n False is: %s\n",a,b);
就不能正常输出,显示段错误。

我是用gcc 编译的。

hemjidn 发表于 2010-11-27 13:16:58

0是假
但真不是1切记

sharpufo 发表于 2010-11-27 13:33:35

回复【2楼】ddlovepp
回复【1楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------

但是改成printf("Ture is: %f\n False is: %f\n",a,b);
输出的是
Ture is: 0.000000
False is:0.000000

或printf("Ture is: %s\n False is: %s\n",a,b);
就不能正常输出,显示段错误。
-----------------------------------------------------
BOOL值转化成浮点数,一般没这个必要吧?
真的要转化要加强制类型转化,8位cpu用float,呵呵,太奢侈了。。。

试试printf("Ture is: %f\n False is: %f\n",(float)a,(float)b);


“printf("Ture is: %s\n False is: %s\n",a,b);”
a是一个unsigned char类型,你想把a作为一个字符串输出怎么能正常,不明白为什么要这样搞.记住%s对应的是一个字符串指针 char *.
如果是要按字符输出应该是
“printf("Ture is: %c\n False is: %c\n",a,b);”,不过1和0对应的ASC都是不能显示的控制字符。
建议楼主还是仔细看看C数据类型基础.

ddlovepp 发表于 2010-11-27 13:53:41

回复【4楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------

我是想试试 关系操作符产生的结果 是什么类型的,书上说是整形的,我就试试,看一下,谢谢
sharpufo的耐心指导。对了,哥们,能否给我个QQ或邮箱啊,方便交流下。

sharpufo 发表于 2010-11-29 14:28:11

回复【5楼】ddlovepp
-----------------------------------------------------------------------

我的QQ:185027516,不过不常使用。

mail2li 发表于 2010-11-29 14:44:09

楼主多看看C的好教材吧 比如 The C Programming Language 你问的很多问题 都是书上的内容 ——谭浩强的那本鸟书只配用来垫桌腿

ddlovepp 发表于 2010-11-30 10:26:41

回复【7楼】mail2li
-----------------------------------------------------------------------

恩,我现在正在看这本书的英文版呢,不是很厚,有决心看完。
页: [1]
查看完整版本: C语言 关于#define TRUE (1 == 1) 和#define FALSE (0 == 1)的问题