文档章节

C Primer Plus 第6章 C控制语句:循环 6.3 关系运算符和表达式

idreamo
 idreamo
发布于 2016/05/27 06:36
字数 1167
阅读 58
收藏 0

关系运算符

运算符 含义
< 小于
<= 小于等于
== 等于
>= 大于等于
> 大于
!= 不等于

注意:关系表达式也可以用于字符的比较。例:ch!='$';进行比较时使用的是机器的字符代码(我们假定为ASCII)。然而不能使用关系运算符来比较字符串。

关系运算符也可以用来比较浮点数。但要小心,在浮点数比较中只能使用>和<。原因在于传入误差可能导致两个逻辑上相等的数不相等。例如,3和1/3的乘积应该是1.0.但是如果您使用6位小数来表示1/3,乘积就是.999999而不是1.使用在math.h头文件中声明的fabs()函数可以方便的进行浮点数判断。这个函数返回一个浮点数的绝对值(即没有代数符号的值)。

例如,您可以使用类似程序清单6.5的方法来判断一个数是否接近一个想要的结果。

//cmpflt.c -- 浮点数比较
#include <math.h>
#include <stdio.h>
int main(void)
{
    const double ANSWER = 3.14159;
    double response;
    printf("What is the value of pi?\n");
    scanf("%lf",&response);
    while(fabs(response-ANSWER)>0.0001)
    {
        printf("Try again!");
        scanf("%lf",&response);
    }
    printf("Close enough!\n");
    return 0;
}

在用户的答案与正确的答案的误差小于0.0001之前,这个循环反复地请求输入答案。

6.3.1 什么是真

对于C来说,一个真表达式的值为1,而一个假表达式的值为0.

6.3.2 还有什么是真

更一般地,所有的非零值都被认为是真,只有0被认为是假。C对真的范围放的非常宽。

可以说,只要while循环的判断条件的值非零,它就可以执行循环。这使得判断条件是建立在数值的基础上而不是真假的基础上。要谨记如果关系表达式为真,它的值就为1;如果为假,它的值就为0.

6.3.3 真值的问题

要确保使用正确的运算符。编译器允许您使用错误的形式,产生您不希望的结果。

如果比较的双方中有一个是常量,则可以把它放在比较表达式的左边,这样有助于发现错误。

5==canoes;

关键之处在于,为常量赋值是非法的。所以编译器把赋值运算符的这种用法识别为语法错误(5=canoes).

总之,关系运算符被用来构成关系表达式。关系表达式在为真时,值为1,为假时值为0.通常使用关系表达式作为判断条件的语句(例如while和if)可以使用任何表达式作为判断,非零值被认为是真,而零值被认为是假。

6.3.4 新的_Bool类型

在C中,表示真/假的变量一直是由int类型来表示的。C99专门为这种类型的变量添加了_Bool类型。

一个_Bool变量只可以具有值1或0。如果您把一个_Bool变量赋为一个非零值,变量就被设置为1.这说明,C把任何非零值都认为是真。

程序清单6.9 boolean.c程序

//boolean.c --使用_Bool变量
#include <stdio.h>
int main(void)
{
    long num;
    long sum=0L;
    _Bool input_is_good;
    printf("Please enter an integer to be summed.(q to quit):");

    input_is_good = (scanf("%ld",&num)==1);
    while(input_is_good)
    {
        sum = sum + num;
        printf("Please enter next integer(q to quit ):");
        input_is_good = (scanf("%lf",&num)==1);
    }
    printf("Those integer sum to %ld.\n",sum);
    return 0;
}

注意代码是如何把比较结果赋值给变量的:

 input_is_good = (scanf("%ld",&num)==1);

这是有意义的,因为==运算符的返回值为1或0.顺便说一句,把==表达式括起来的()不是必需的,因为==运算符的优先级高于=,但是它们可以使代码更容易阅读。

C99还提供了一个stdbool.h的头文件。包含这个头文件可以使用bool来代替_Bool,并把true和false定义成值为1和0的符号常量。

6.3.5 关系运算符的优先级

关系运算符的优先级要低于包括+和-在内的算术运算符,但是要高于赋值运算符。

运算符的优先级

运算符(优先级从高到低) 结合性
() 从左到右
- + ++ -- sizeof(type)(所有一元符) 从右到左
* / % 从左到右
+ - 从左到右
< > <= >= 从左到右
== != 从左到右
= 从右到左

 

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
C Primer Plus 第6章 C控制语句:循环 6.5 for循环

for 循环把所有这三种动作(初始化、测试、更新)都放在一起。通过使用for循环,您可以用程序清单6.11中的程序来代替前一个程序 。 程序清单6.11 sweetie2.c 在关键字for之后的圆括号中包含了...

idreamo
2016/05/31
23
0
C Primer Plus 第5章 运算符、表达式和语句 5.4 表达式和语句

5.4.1 表达式 表达式是由运算符和操作数组合构成的。最简单的表达式是一个单独的操作数,以此作为基础可以建立复杂的表达式。 每一个表达式都有一个值 C的一个重要属性是每一个C表达式都有一...

idreamo
2016/05/20
51
0
关东升的《从零开始学Swift》3月9日已经上架

大家一直期盼的《从零开始学Swift》于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发。全书共分5 部...

tony关东升
2018/06/26
0
0
关东升的《《从零开始学Swift》即将出版

大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版《从零开始学Swift》《从零开始学Swift》将在《Swift开发指南》第1版的基础上添加Swift2.0的...

智捷课堂
2015/08/17
109
0
C语言-第三章、选择结构程序设计

_1.1关系运算符:<、<=、>、>=、==和!=。 _1.2关系表达式: 形式:表达式 关系运算符 表达式 如:a+b>c-d _2.1逻辑运算符:&&、 、!。 逻辑表达式:表达式 逻辑运算符 表达式 如:a&&b&&c...

南风末
2016/10/31
5
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
26分钟前
4
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
27分钟前
7
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
30分钟前
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
36分钟前
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部