C语言 关于逻辑值的问题 有加分

请对比看以下的两道题:
1. 设有条件的表达式:(EXP)?i++;j++,则以下表达式中与(EXP)完全等价的是:
A.(EXP!=0) B.(EXP==1) 答案是A。
2.设有定义:int k=1;假如有k=k>=k, 则k=___ 答案是1.

问题1.书上说逻辑表达式若为真,值为1,假值为0,那在第1题中A和B应该是等价的呀,为什么答案B不对?

2.有的书上说像这样的语句 (3)?a:b; 最后结果肯定是a,那我想问判断数字3的真假怎么判断呢? 不是真的值为1,假的值为0 么? 那在条件判断中写 除了1,0其他的数字肯定是不对的啊???? 要这个成立,那不就是 为真的条件可以用各种非0的数表示,那书上怎么说逻辑真的值用1表示呢???

3.在第1题中 EXP为真 和 EXP的值为1 和 EXP==1, 这三者到底是什么关系?这三者有什么区别???
请逐条回答,我到底是哪里掌握不好,理解错了呢?请说清楚一点 谢谢
对于一楼的解释 我还有几个问题,补充字数打不开了。。。。。
1.bool型变量是什么东西?
2.对于一楼楼主所说的:令False=0,True=1,则 !True=False,但是!False不一定等於True 一楼楼主自己编个程序 看看 !False 是不是等于1。

首先对你的苦恼表示理解和同情。一句话,二值世界中只有0和非0两个概念,如何再有1????1的引入只是编译器实现和人类的习惯。
C语言标准规定“0为假,非0为真”,这是毫无疑问的。但是“非0”并不是一个具体的值,大多编译器都把“非0”实现为1,照顾人类习惯,但引起了很多误会。
第一题:A毫无疑问
第二题:k>=k是成立的,为真,但是标准没有规定真就一定是1,只是大部分实现为1而已,故此题出得不好。
“逻辑表达式若为真,值为1,假值为0” 说法不对。
所以C语言没有bool型变量,手动定义bool变量会带来很多麻烦,如:
令False=0,True=1,则 !True=False,但是!False不一定等於True,因为标准并未规定True等於1.追问

1. 可是我在VC++6.0版本的编译器中 输入以下程序:
#include
int main() {int k; k=k>=k; printf("%d",k); returen 0;}
编译连接运行后,确实显示的是1, 请问 k>=k 此表达式是逻辑真 这楼主是毫无争议的吧, 那把此表达式的值(即是逻辑真的值) 赋予k 那为什么k的值运行出来是1呢?
楼主是不是说错了? 2. 还有 楼主能不能解释下 二值世界中怎么会没有1呢?不是逢二进一吗,应该有0,1 两个数啊

追答

请jnjxcxg再看看我的回答吧,“标准"和"实现"是两个不同的范畴,绝大多数的编译器把真(非0)定义为1,但标准规定任何非零的数都是真. 但实际上,你可以想象一下,定义真为2、3、4、5、。。。是不是也可以呢?即if(1) if(2) if(3)。。。都是真。你的验证表明VC++6.0将真定义为1,我在GCC4.4.3下验证,也是同样的结果。
关于二值世界,请不要误会。比如“优”“良”“中”“差”构成了一个四值空间,而“优”“非优”构成了一个二值空间,类似的“0”和“非0”构成二值空间,从这个角度来讲1、2、3、。。。都是平权的,它们都是非0.
出题者并未紧扣标准,或者强调了具体的实现,所以出现了题2这种题目。楼主明白即可,不必过度纠缠,这本非一个尽善尽美的世界。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-11
c认为非0既为真。其它语言并非一定如此。非0,你可以认为它是除0以外的任何值。
且计算机认为0的正负有别,负0的2进制表示为:10000000。正0的2进制表示为:00000000,C并不一定这么认为。你可个动手试验一下负0是否为真。

由微软定义的BOOL型数据有三种可能TRUE、FALSE、ERROR。也就是说BOOL型数据可能是非真也非假,而是ERROR。
bool型数据则必然是“真”“假”的其中一个。

BOOL型由typedef int BOOL得来,在windef.h中定义。sizeof(BOOL)与sizeof(int)相等。(注意:sizeof(int)并非一定等于4)

bool类型不知道怎么来的,只知道它只占1bit,既一位。表数范围非0既1。
如果bool型的确认方法是“取最高位”那么负0应该为真。

条件表达式与逻辑表达示的运算结果都是bool型数据。
如:
int a = 100;
则:
printf("a=%d, !a=%d, a&&a=%d, a||a=%d", a, !a, a&&a, a||a);
运行结果:100, 0, 1, 1

另有两点值得注意
1、输出结果。当表达示的值为TRUE并不一定输出“1”。视编译器而定。有时TRUE表示的是"true";
2、关于&&和||这两个运算符
int a = 0, b = 1;
if(a && b++)
{
....
}
printf("%d", b);
输出结果为:1
//这是不是出乎意料?明明b++应该是2才对为什么输出了1?
//下面说明&&运算是咋回事

if(a && b++)相当于

if(a==true)
{
if((b++)==true)
{
....
}
}
看到了吗?当a为假时b++并未被执行,也就是说当&&左边的表达式为假时不再执行&&右侧的表达式,而是直接认为这个&&表达式的值为假。
||运算也存在同样的问题。
相似回答