4.3 逻辑和关系运算符(2)

2013-10-07 16:29:21 · 作者: · 浏览: 114

4.3  逻辑和关系运算符(2)

相等性测试与布尔字面值

如果想测试一个算术对象或指针对象的真值,最直接的方法就是将其作为if语句的条件:
 

  1. if (val) { /* . . . */ }        // 如果val是任意的非0值,条件为真  
  2. if (!val) { /* . . . */ }       // 如果val是0,条件为真 

在上面的两个条件中,编译器都将val转换成布尔值。如果val非0则第一个条件为真,如果val的值为0则第二个条件为真。

有时会试图将上面的真值测试写成如下形式:

  1. if (val == true) { /* . . . */ } // 只有当val等于1时条件才为真! 

但是这种写法存在两个问题:首先,与之前的代码相比,上面这种写法较长而且不太直接(尽管大家都认为缩写的形式对初学者来说有点难理解);更重要的一点是,如果val不是布尔值,这样的比较就失去了原来的意义。

如果val不是布尔值,那么进行比较之前会首先把true转换成val的类型。也就是说,如果val不是布尔值,则代码可以改写成如下形式:
 

  1. if (val == 1) { /* . . . */ } 

正如我们已经非常熟悉的那样,当布尔值转换成其他算术类型时,false转换成0而true转换成1(参见2.1.2节,第35页)。如果真想知道val的值是否是1,应该直接写出1这个数值来,而不要与true比较。

进行比较运算时除非比较的对象是布尔类型,否则不要使用布尔字面值true和false作为运算对象。

4.3节练习

练习4.8:说明在逻辑与、逻辑或及相等性运算符中运算对象求值的顺序。

练习4.9:解释在下面的if语句中条件部分的判断过程。

  1. const char *cp = "Hello World";  
  2. if (cp && *cp) 

练习4.10:为while循环写一个条件,使其从标准输入中读取整数,遇到42时停止。

练习4.11:书写一条表达式用于测试4个值a、b、c、d的关系,确保a大于b、b大于c、c大于d。

练习4.12:假设i、j和k是三个整数,说明表达式i!=j<k的含义。