比较大小:使用关系运算和表达式
进行比较的表达式叫关系表达式,其中出现的运算称为关系运算符
C中的关系运算符
运算符 | 含义 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
>= | 大于等于 |
> | 大于 |
!= | 不等于 |
关系运算符也可以用于浮点数。但是只能使用<和>,原因在舍入误差可能造成两个逻辑上应该相等的数不相等。使用在math.h头文件中声明的fabs()函数可以方便地进行浮点数判断,这个函数返回浮点数的绝对值。
//6-5.c ---浮点数比较
#include <stdio.h>
#include <math.h>
int main (void)
{
const double ANSWER = 3.14149;
double response;
printf ("What is the value of pi?\n");
scanf ("%lf",&response);
while (fabs (response - ANSWER) > 0.0001)
{
printf ("Try again !\n");
scanf ("%lf",&response);
}
printf ("Close enough!\n");
return 0 ;
}
每个表达式都被判定为真或者假(永久没有可能)
什么是真
C的表达式通常都有一个值 所以关系运算也是如此。在C中一个真表达式的值为1而一个假的表达式的值为0
//6-6.c----c中的真和假的值
#include <stdio.h>
int main (void)
{
int true_val,false_val;
true_val = (10 > 2);
false_val = (10 < 2);
printf ("ture = %d,false = %d\n",true_val,false_val);
return 0 ;
}
运行结果ture = 1,false = 0
还有什么是真:
6-7.c -- 哪些值为真
#include <stdio.h>
int main (void)
{
int n = 3;
while (n)
printf ("%2d is true \n",n--);
printf ("%2d is false \n",n);
n = -3;
while (n)
printf ("%2d is true \n",n++);
printf ("%2d is false \n",n);
return 0 ;
}
运行结果
3 is true
2 is true
1 is true
0 is false
-3 is true
-2 is true
-1 is true
0 is false
所看从这程序看出:判断条件是建立在数值的基础上而不是建立在真假基础上。要谨记如果关系表达式为真它是值就为1,如果为假,它的值就为0.也可以说所有非零的值都被认为是真,只有0被认为是假
//6-8.c -- 误用=(赋值符)
//将导致无限的循环
#include <stdio.h>
int main (void)
{
long num;
long sum = 0L;
int status;
printf ("Please enter an integer to be summed.");
printf ("(q to quit): ");
status = scanf ("%ld",&num);
while (status = 1)
{
sum = sum + num;
printf ("Please enter an integer (q to quit ):");
status = scanf ("%ld",&num);
}
printf ("Those integers sum to %ld .\n",sum);
return 0 ;
}
新的_Bool类型(c99专门定义的)
_Bool变量只可以具有值1(真)或0(假)如果把一个_Bool变量赋为一个非零的数值,变量被设置为1这说明C把任何非零的值都认为是真。
//6-9.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.");
printf ("(q to quit): ");
input_is_good = (scanf ("%ld",&num) == 1);
while (input_is_good)
{
sum = sum + num;
printf ("Please enter an integer (q to quit ):");
input_is_good = (scanf ("%ld",&num) == 1);
}
printf ("Those integers sum to %ld .\n",sum);
return 0 ;
}
关系运算符的优先级
关系运算符的优先级要比算术运算符要低,但是经比赋值符要高,它的结合方向也是从左到右的方式。同时关系运算符本身出分为高优先级组和低优先级组
高优先级组 | <(大于) <=(大于或等于) >(小于) >=(小于或等于) |
低优先级组 | ==(等于) !=(不等于) |
运算符的优先级(已学过的)
运算符(优先级从高到低) | 结合性 |
() | 从左到右 |
- + ++ -- sizeof (type) (所有一元运算符) | 从左到右 |
* / % | 从左到右 |
+ - | 从左到右 |
< > <= >= | 从左到右 |
== != | 从左到右 |
= | 从右到左 |
总结 while语句
While 语句创建一个在判断表达式为假之前重复执行的循环,while语句是一个入口条件循环,也就是说,是否执行循环的决定是在进入循环之前就做出的。循环体的语句可以是一个简单的语句也可是一个复合语句(复合语句要求一定要用花括号括起来)。
总结关系运算符和表达式:
每个关系运算符都把它的左边的值与它右边的值进行比较。如果关系为真,关系表达式的值为1,如果关系为假,关系表达式的值为0.
不确定的循环与计数循环
不确定循环:也就是说在表达式变为假之前你不能预先知道循环要执行多少次
计数循环:它们循环执行预先确定的次数
//6-10.c -- 一个计数循环
#include <stdio.h>
int main (void)
{
int a = 1;
const int NUMBER = 22;
while (a++ <= NUMBER)//最好用这种方法而不是用(while (a <= NUMBER)在到后面在加一个a++语句)
{
printf ("Be my valentine!\n");
}
printf ("一共循环了:%d 次\n",a-1);
return 0 ;
}
在建立一个重复执行固定次数循环是涉及到的三个动作
1. 必须初始化一个计数器
2. 计算器与某个有限的值进行比较
3. 每次执行循环,计数器的值都要递增或递减