搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2010-11-27 11:44:40 | 显示全部楼层 |阅读模式
#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程序员回答下,谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 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 ....{真值时执行的代码}

}

出0入0汤圆

 楼主| 发表于 2010-11-27 12:34:40 | 显示全部楼层
回复【1楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------

typedef  char 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);
,typedef  XXX 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 编译的。

出0入0汤圆

发表于 2010-11-27 13:16:58 | 显示全部楼层
0是假
但真不是1切记

出0入0汤圆

发表于 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数据类型基础.

出0入0汤圆

 楼主| 发表于 2010-11-27 13:53:41 | 显示全部楼层
回复【4楼】sharpufo 风生水起月皎白
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-11-29 14:28:11 | 显示全部楼层
回复【5楼】ddlovepp
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-11-29 14:44:09 | 显示全部楼层
楼主多看看C的好教材吧 比如 The C Programming Language 你问的很多问题 都是书上的内容 ——谭浩强的那本鸟书只配用来垫桌腿

出0入0汤圆

 楼主| 发表于 2010-11-30 10:26:41 | 显示全部楼层
回复【7楼】mail2li
-----------------------------------------------------------------------

恩,我现在正在看这本书的英文版呢,不是很厚,有决心看完。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-27 19:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表