### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

while在英文中常被翻译为“在……的时候,当……时”,私以为在C语言的while里,应当为“当……的时候,一直……”

因为这样说,才符合while表示循环的身份,while循环结构也是C语言很常见和很重要的一种语法

while的作用是:

表示一种入口条件循环——while循环结构。

1、while的使用

如果你已经有C程序的编程经验,那可能while已经是你的老熟人了,如果你正在学循环结构,不妨也一起回顾一下while的格式:

int i = 0;
while (i < 10)   /* while关键字后跟小括号,括号内是逻辑表达式,只要逻辑表达式成立,就循环地执行while后的语句 */i++;     /* 这是一条循环体的语句,这段代码的效果是i从0开始一直自增1,i=10的时候循环结束 */int i = 0, sum = 0;
while (i < 10)   /* 如果循环体是复合语句,需要加大括号 */
{                /* 这段代码的效果是,sum保存的是0到9的和 */sum += i;i++;
}

2、谈谈逻辑表达式

和if-else的逻辑表达式类似,效果都是看看是否成立,成立的标准是看表达式的值是不是非零或者true,反之不成立是0和false

作为一种入口条件循环,while关键字后的逻辑表达式只要成立,就会执行循环体,然后返回再看逻辑表达式是否成立,以此循环

所以你可能注意到了,如果逻辑表达式一直成立呢?这就是我们常说的死循环:

while (1)
{/* 这种死循环很常见,并非人为疏忽造成的bug,而是利用死循环的特性写的程序,如多线程编程中常用这种死循环 *//* 提示:如果逻辑表达式是整数常量,记住,只有0表示false,非零常量都表示true,3,1024,-1 ,-10等等 *//* 不过习惯上就写while (1)就行,写while (1024)的话其他同事看着不知道你这是什么名堂 */
}while (true)
{/* true是bool常量,当然也表示成立,java转过来的程序员对这种写法应该更倍感亲切,因为java的死循环喜欢这样写 */
}int i = 0;
int j = 1, sum = 0;
while (i < 10)
{sum += j;j++;/* 整个循环体中忘记了对循环条件做处理导致的死循环,这种bug在使用while结构且循环体比较长的时候可能发生 */
}

有一种常见的while循环的应用,叫做读循环,它是指循环地输入一些数据然后处理,一遍一遍地执行这样的操作:

int a, b, flag;
flag = scanf("%d%d", &a, &b);   /* 输入两个整数 */
while (flag == 1)
{printf("Summary is %d\n", a + b);   /* 打印两个数的和 */flag = scanf("%d%d", &a, &b);       /* 再输入两个数,循环上述步骤 */
}/* 顺便提醒一句,编程需要谨慎认真,专心致志,==运算符一定要与=运算符区分好,下面这种是常见错误 */
while (flag = 1)   /* 这相当于把flag赋值为1了,而不是逻辑表达式 */
{/* 好的编译器在这里会报错 */
}

这只是读循环的一个小demo,一般输入语句存在于while之前和循环体的最后,不过在C语言的风格中,还有一种更简练的写法:

int a, b;                               /* flag直接省了 */
while (scanf("%d%d", &a, &b))           /* 这样用scanf是因为它被成功调用时会返回一个1,这里索性把==运算符也省了 */
{printf("Summary is %d\n", a + b);   /* 打印两个数的和 */
}

ACMer或者参加过程序设计大赛、算法比赛和认证的人可能对上面这种很大神的操作很熟悉,那是对付OJ系统上的输入类的题的一种技巧

3、while的应用

说到while的常见使用,我首先能想起的是人性化输入纠错(自己安的名字):

char sex;
scanf("%c", &sex);                 /* 输入性别,只能是字符m或f */
while (sex != 'm' && sex != 'f')   /* 只要输入的不是m和f,就重来 */
{printf("Wrong character, input again:\n");scanf("%c", &sex);
}
/* 另外常见的还有必须输入正数,必须输入数字,必须输入字母,必须是某几种枚举,为的是保证输入数据符合后面的程序处理 */

还有一种很常见应用就是与指针的配合了,比如链表的遍历:

cur = head->next;   /* p指向带头结点的链表的第一个结点 */
while (cur)         /* 这里其实应该写为cur != NULL */
{printf("%d\t", cur->value);cur = cur->next;
}
/*因为在一个链表中,尾结点的next指针一般是NULL的,而NULL可以作为不成立的逻辑表达式,与false和0效果一样所以上述程序的效果就是,cur指针按序指向每个结点,当遍历完最后一个结点后,cur=cur->next=NULL回到while头的循环条件判断时则会不成立,由此跳出了循环,所以最后一条语句一定要有,否则会死循环
*/

当然,多线程中也常见while,而且是死循环的while(死循环一般很少用do-while循环和for循环):

/* 常规操作:while(1) */
while (1)   /* 报时器 */
{Sleep(1000);   /* 线程休眠1s */char* time;getSystemTime(time);printf("Current time : %s\n");   /* 打印当前时间 */
}/* 非主流操作:for(;;) */
for(;;)
{Sleep(1000);   /* 线程休眠1s */char* time;getSystemTime(time);printf("Current time : %s\n");   /* 打印当前时间 */
}/* 魔鬼般的操作:do-while */
do{Sleep(1000);   /* 线程休眠1s */char* time;getSystemTime(time);printf("Current time : %s\n");   /* 打印当前时间 */
}
while (1)

——参考《C Primer Plus第五版》

相关文章:

C语言关键字浅析-for

C语言关键字浅析-do

C语言关键字浅析-break

C语言关键字浅析-continue

C语言关键字浅析-while相关推荐

  1. C语言关键字浅析-enum

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### enum关键字的原型是enumerated type,意思是枚举类型 这是ISO/ANSI C90标准新增的关键字之 ...

  2. C语言关键字浅析-return

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### return关键字是C程序中最常见的关键字之一 对于一个最简单的demo程序,或者说你最早接触的HELLO WORL ...

  3. C语言关键字浅析-double

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### double关键字声明一种称之为"双精度"的浮点数据类型 其"双"之处在于与 ...

  4. C语言关键字浅析-float

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### float从单词的字面上看是"浮动"的意思 在C语言中,float表示一种基本数据类型,浮点型, ...

  5. C语言关键字浅析-do

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### do关键字在C语言中不能单独使用 它需要和while关键字配套使用表示一种退出条件循环结构 其区分于while循环和 ...

  6. C语言关键字浅析-_Imaginary

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### _Imaginary是C99新增的关键字,表示一种基本数据类型--虚数 与_Complex一样,该类型的出现主要是为 ...

  7. C语言关键字浅析-short

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### short,本意是"短,矮"的意思,在C语言中声明一种短整数类型,与long相对应 short与 ...

  8. C语言关键字浅析-switch

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### switch在英文中是"开关"的意思,比如switch on和switch off可以表示电灯的 ...

  9. C语言关键字浅析-const

    ### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### const关键字是ISO/ANSI C90标准新添加的关键字之一 同期的"新生"还有enum.s ...

最新文章

  1. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(输出多个分组、色彩配置、添加数据点)实战
  2. 美国康奈尔大学计算机科学的教授,美国康奈尔大学教授Robbert van Renesse访问并做学术报告...
  3. java.lang.Math
  4. Happy Number 十进制转特殊三进制
  5. webpack打包过程如何调试?
  6. python生成多个列表_python生成多个只含0,1元素的随机数组或列表(代码)
  7. 信息学奥赛C++语言:行李托运
  8. 菜单响应函数:ON_COMMAND和ON_UPDATE_COMMAND_UI,ON_COMMAND_RANGE和ON_UPDATE_COMMAND_UI_RANGE
  9. 对比了 18000 个 Python 项目,这 TOP45 值得学习!
  10. 30.TCP/IP 详解卷1 --- 其他的 TCP/IP 应用程序
  11. 琴生Jensen不等式,条件期望
  12. C#序列化枚举为字符串和自定义转换器
  13. hg8245c backupsettings.html,如何通过中国电信光猫华为HG8245C打开IPV6
  14. 微信小程序图片上传java后台
  15. Java实现堆栈(Stack)
  16. lizbaka的周记
  17. 免费pdf转word网页版
  18. DirectX11(二)
  19. NGINX源码之:ngx_bufchain
  20. 将栅格影像转换为CAD/GIS矢量的3种方法

热门文章

  1. python 抓取天涯帖子内容并保存
  2. 使用java实现语音朗读
  3. 3个5相乘列乘法算式_「百树云课堂」初一数学必考的知识点(21个)
  4. (14)高通AP10.4开发者指南——WLAN(3.3 分层)
  5. 国内安全设备厂家排名
  6. POP和PUSH指令
  7. 我的奇思妙想机器人消防员_我的奇思妙想智能机器人作文400字
  8. 独家 | 流媒体服务中的诈骗检测
  9. phoenix启动 Unable to load native-hadoop library for your platform... using builtin-java classes wher
  10. odoo与企业微信融合