学习笔记3.(while循环)

C控制语句:循环

1.while循环

     (1.)何时终止循环
程序示例1.1:
#include <stdio.h>
int main(void)
{
     int n=5;
          while(n<7) //第7行
     {
          printf(“n=%d\n”,n);
          n++;第10行
          printf(“Now n = %d\n”,n);//第11行
     }
     printf(“The loop has finished.\n”);
     return 0;
}
运行程序,输出如下:
n = 5
Now n = 6
n=6
Now n = 7
The loop has finished.
在第2次循环时,变量n在第10行首次获得值7。但是,此时程序并未退出,它结束本次循环(第11行),并在对第7行的测试条件求值时才退出循环(变量n在第1次判断时为S,第2次判断时为6)。
     (2.)while: 入口条件循环
          while循环是使用入口条件的有条件循环。所谓“有条件”指的是语句部分的执行取决于测试表达式描述的条件,如(index < 5)。该表达式是一个入口条件(entry condition),因为必须满足条件才能进入循环体。在下面的情况中,就不会进入循环体,因为条件一开始就为假:
index=10;
while (index++ < 5)
     printt(“Have a fair day or better.\n”);
把第1行改为: Index = 3;
就可以运行这个循环了。
     (3.)用关系运算符和表达式比较大小
          while循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式(relational expression),出现在关系表达式中间的运算符叫做关系运算符(relational operator)。前面的示例中已经用过一些关系运算符,表1.2列出了C语言的所有关系运算符。该表也涵盖了所有的数值关系(数字之间的关系再复杂也是有人与人之间的关系复杂)。
表1.2:

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

     关系运算符常用于构造while语句和其他C语句中用到的关系表达式。这些语句都会检查关系表达式为真还是为假。下面有3个互不相关的while语句,其中都包含关系表达式。
while (number < 6)
{
     printf(“Your number is too small.\n”);
     scanf("%d", number);
}

while (ch !=’$’)
{
     count++;
     scanf("%c", &ch);
}
while (scanf("%f", &num) == 1)
          sum = sum + num;
          注意,第2个while语句的关系表达式还可用于比较字符。比较时使用的是机器字符码(例如:ASCII码)。但是,不能用关系运算符比较字符串。
          虽然关系运算符也可用来比校浮点数,但是要注意比较浮点数时,尽量只使用<和>。因为浮点数的舍入误差会导致在逻辑上应该相等的却不相等。例如3乘以1/3的积是1.0。如果用把1/3表示成小数点后面6位数字,乘积则是.999999,不等于1。使用fabs()函数(声明在math.h头文件中)可以方便地比较浮点数,该函数返回一个浮点值的绝对值(即没有代数符号的值)。

2.新的_Bool类型
       在C语言中,一直用int类型的变量表示真/假值。C99专门针对这种类型的变量新增了_Bool 类型。该类型是以英国数学家George Boole的名字命名的,他开发了用代数表示逻辑和解决逻辑问题。在编程中,表示真或假的变量被称为布尔变量(Boolean variable), 所以_Bool类型是C语言中布尔变量的类型名。_Bool类型的变量只能储存1 (真)或0 (假)。如果把其他非零数值赋给_Bool类型的变量,该变量会被设置为1。这反映了C把所有的非零值都视为真。
       把int类型的变量status替换成_Bool类型的变量input_is_good。给布尔变量取一个能表示真或假值的变量名是一种常见的做法。
程序1.3 boolean.程序
//boolean.c – 使用_bool类型的变量variable
#include <stdio.h>
int main(vold)
{
       long num:
       long sum = OL:
       _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 next integer (q to qut): “)
               input_is_good = (scanf(”%ld”, &num) == 1);
       }
       printf("Those integers sum to %ld.\n”,sum);

       return 0;
}
       注意程序中把比较的结果赋值给_Bool 类型的变量input_is_good:
       input_is_good = (scanf("%ld", &num) == 1);
       这样做没问题,因为==运算符返回的值不是1就是0。顺带一提,从优先级方面考虑的话,并不需要用圆括号把scanf(“%ld", &num) == 1括起来。但是,这样做可以提高代码可读性。还要注意,如何为变量命名才能让while循环的测试简单易懂:
       while (input_is_good)
       C99提供了stdbool.h头文件,该头文件让bool成为_Bool的别名,而且还把true和false 分别定义为1和0的符号常量。包含该头文件后,写出的代码可以与C++兼容,因为C++把bool、true和false定义为关键字。
       如果系统不支持_Bool 类型,导致无法运行该程序,可以把_Bool替换成int即可。
3.优先级和关系运算符
       关系运算符的优先级比算术运算符(包括+和-)低,比赋值运算符高。这意味着x > y+2 和 x >(y+2)相同,x = y > 2和x = (y> 2)相同。换言之,如果y大于2,则给x赋值1,否则赋值0。y的值不会赋给x。
       关系运算符比赋值运算符的优先级高,因此,x_bigger = x > y;相当于x_bigger = (x>y);。
       关系运算符之间有两种不同的优先级。
       高优先级组: <<= >>=
       低优先级组: == !=
       与其他大多数运算符一样,关系运算符的结合律也是从左往右。因此:
       ex != wye == zee 与 (ex != wye) == zee 相同
       表1.4 运算符优先级

运算符(优先级从高到低)结合律
()从左往右
-   +   ++   - -  sizeof从右到左
*  /  %从左到右
+  -从左到右
<  >  <=  >=从左到右
==  !=从左到右
=从右到左

小结: while语句
      关键字: while
      一般注解:
      while语句创建了一个循环,重复执行直到测试表达式为假或0。while语句是一种入口条件循环,也就是说,在执行多次循环之前已决定是否执行循环。因此,循环有可能不被执行。循环体可以是简单语句,也可以是复合语句。
      形式:
      while ( expression )
            statement
      在expression部分为假或0之前,重复执行statement部分。
      示例:
      while (n++ < 100)
            printf(" %d %d\n",n, 2*n + 1; //简单语句
      while (fargo < 1000)
      {// 复合语句
            fargo = fargo + step;
            step = 2 * step;
      }
小结:关系运算符和表达式
      关系运算符:
      每个关系运算符都把它左侧的值和右侧的值进行比较。
      <       小于
      <=      小于或等于
      =      等于
      >=      大于或等于
      !=      不等于
      关系表达式:
      简单的关系表达式由关系运算符及其运算对象组成。如果关系为真,关系表达式的值为 1 ;如果关系为假,关系表达式的值为0。
      示例:
      5> 2为真,关系表达式的值为1
      ( 2 + a ) == a 为假,关系表达式的值为0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值