-
while循环用法_宏程序的循环指令(WHILE语句)
2020-12-12 13:34:52循环指令(WHILE语句)格式:WHILE [条件表达式] DO m(m=1,2,3)...........END m............ 当条件表达式条件满足时,就循环执行DO与END之间的程序段,之间的程序段也称之为 “循环体”,当条件不满足时便执行END后...循环指令(WHILE语句)格式:
WHILE [条件表达式] DO m(m=1,2,3)
...........
END m
............
当条件表达式条件满足时,就循环执行DO与END之间的程序段,之间的程序段也称之为 “循环体”,当条件不满足时便执行END后的下一个程序段。DO和END后的数字m用于指定程序执行范围的识别号,该识别号只能在数字1 ,2 , 3中取值。
例如下程序,如果变量#501的值大于1(条件满足),执行循环体内的程序段,如果条件不满足则转移至END后的下一程序,此时循环体结束循环。
WHILE [#501 GT 1] DO 1
G00 G90 G54 X100. Y100.
.............
.............
END 1
G00 Z200. M5
采用循环指令(WHILE语句)编程如下:
#500=100./2
#501=85./2
#502=10.
#503=#502/4
#504=#502-#503
G90 G00 G54 X-#500 Y#501 M3 S1000
G43 H22 Z100.
G00 Z2.
G01 Z0. F3000
WHILE [ #501 GE #504] DO1
#500=#500-#504
#501=#501-#504
G01 X#500
Y-#501
X-#500
Y#501
END1
G01 X#500
Y0.
X-#500
G00 Z100. M5
M0仿真加工效果如下视频:
补充一下循环语句的 “嵌套” 用法:
(1)在DO--END循环中的识别号1,2,3可根据需要多次使用。
(2)不能交叉执行DO语句,如下书写格式是错误的:
WHILE [..........] DO 1
............
WHILE [..........] DO 2
...........
END 1
END 2(3)嵌套层数最多3层,如下书为正确格式:
WHILE [.......] DO 1
.........
WHILE [.........] DO 2
..........
WHILE [.........] DO 3
........
END 3
.......
END 2
........
END 1
(4)可以在循环内跳转到循环外,如下书写为正确格式:
WHILE [........] DO 1
IF [..........] GOTO n
........
END 1
N n ........
每天学习一点点,进步一点点
Anything is possible
-
宏定义中使用do{}while(0)的好处
2011-04-27 11:05:00同时因为绝大多数的编译器都能够识别do{…}while(0)这种无 用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低 在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中...使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,
从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无
用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低
在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。
但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。
1. do...while(0)消除goto语句。
通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样:
version 1
bool Execute()
{
// 分配资源
int *p = new int;
bool bOk(true);// 执行并进行错误处理
bOk = func1();
if(!bOk)
{
delete p;
p = NULL;
return false;
}bOk = func2();
if(!bOk)
{
delete p;
p = NULL;
return false;
}bOk = func3();
if(!bOk)
{
delete p;
p = NULL;
return false;
}// ..........
// 执行成功,释放资源并返回
delete p;
p = NULL;
return true;
}这里一个最大的问题就是代码的冗余,而且我每增加一个操作,就需要做相应的错误处理,非常不灵活。于是我们想到了goto:
version 2bool Execute()
{
// 分配资源
int *p = new int;
bool bOk(true);// 执行并进行错误处理
bOk = func1();
if(!bOk) goto errorhandle;bOk = func2();
if(!bOk) goto errorhandle;bOk = func3();
if(!bOk) goto errorhandle;// ..........
// 执行成功,释放资源并返回
delete p;
p = NULL;
return true;errorhandle:
delete p;
p = NULL;
return false;
}代码冗余是消除了,但是我们引入了C++中身份比较微妙的goto语句,虽然正确的使用goto可以大大提高程序的灵活性与简洁性,但太灵活的东西往往是很危险的,它会让我们的程序捉摸不定,那么怎么才能避免使用goto语句,又能消除代码冗余呢,请看do...while(0)循环:
version3
bool Execute()
{
// 分配资源
int *p = new int;bool bOk(true);
do
{
// 执行并进行错误处理
bOk = func1();
if(!bOk) break;bOk = func2();
if(!bOk) break;bOk = func3();
if(!bOk) break;// ..........
}while(0);
// 释放资源
delete p;
p = NULL;
return bOk;
}
2 宏定义中的do...while(0)
如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do...while(0)或do...while(false), 比如说:
#define AFXASSUME(cond) do { bool __afx_condVal=!!(cond); ASSERT(__afx_condVal); __analysis_assume(__afx_condVal); } while(0)
粗看我们就会觉得很奇怪,既然循环里面只执行了一次,我要这个看似多余的do...while(0)有什么意义呢?
当然有!
为了看起来更清晰,这里用一个简单点的宏来演示:
#define SAFE_DELETE(p) do{ delete p; p = NULL} while(0)
假设这里去掉do...while(0),
#define SAFE_DELETE(p) delete p; p = NULL;
那么以下代码:
if(NULL != p) SAFE_DELETE(p)
else ...do sth...
就有两个问题,
1) 因为if分支后有两个语句,else分支没有对应的if,编译失败
2) 假设没有else, SAFE_DELETE中的第二个语句无论if测试是否通过,会永远执行。
你可能发现,为了避免这两个问题,我不一定要用这个令人费解的do...while, 我直接用{}括起来就可以了
#define SAFE_DELETE(p) { delete p; p = NULL;}
的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码:
if(NULL != p) SAFE_DELETE(p);
else ...do sth...
其else分支就无法通过编译了(原因同上),所以采用do...while(0)是做好的选择了。也许你会说,我们代码的习惯是在每个判断后面加上{}, 就不会有这种问题了,也就不需要do...while了,如:
if(...)
{
}
else
{
}
诚然,这是一个好的,应该提倡的编程习惯,但一般这样的宏都是作为library的一部分出现的,而对于一个library的作者,他所要做的就是让其库具有通用性,强壮性,因此他不能有任何对库的使用者的假设,如其编码规范,技术水平等
-
do...while(0) 在宏定义中的应用
2007-03-19 12:55:00这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{...}while结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会...这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{...}while结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会出现。下面是解释:
一方面
假设有这样一个宏定义
#define macro(condition) /
if(condition) dosomething()
现在在程序中这样使用这个宏:
if(temp)
macro(i);
else
doanotherthing();
一切看起来很正常,但是仔细想想。这个宏会展开成:
if(temp)
if(condition) dosomething();
else
doanotherthing();
这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的。
为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。另一方面
这是为了含多条语句的宏的通用性
因为默认规则是宏定义最后是不能加分号的,分号是在引用的时候加上的
比如定义了一个宏fw(a,b),那么在c文件里一定是这样引用
fw(a,b);
如果不用do...while,那么fw就得定义成:
#define fw(a,b) {read((a));write((b));}
那这样fw(a,b);展开后就成了:
{read(a);write(b);};
最后就多了个分号,这是语法错误
而定义成do...while的话,展开后就是:
do{read(a);write(b);}while(0); 完全正确
所以要写一个包含多条语句的宏的话,不用do...while是不可能的 -
do while(0)在宏定义中的应用
2009-05-27 16:30:00这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会...这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会出现。下面是解释:
假设有这样一个宏定义
#define macro(condition) /
if(condition) dosomething()
现在在程序中这样使用这个宏:
if(temp)
macro(i);
else
doanotherthing();
一切看起来很正常,但是仔细想想。这个宏会展开成:
if(temp)
if(condition) dosomething();
else
doanotherthing();
这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的。
为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。
另一个讲解
这是为了含多条语句的宏的通用性
因为默认规则是宏定义最后是不能加分号的,分号是在引用的时候加上的
比如定义了一个宏fw(a,b),那么在c文件里一定是这样引用
fw(a,b);
如果不用do...while,那么fw就得定义成:
#define fw(a,b) {read((a));write((b));}
那这样fw(a,b);展开后就成了:
{read(a);write(b);};
最后就多了个分号,这是语法错误
而定义成do...while的话,展开后就是:
do{read(a);write(b);}while(0); 完全正确
所以要写一个包含多条语句的宏的话,不用do...while是不可能的 -
初学c语言-5循环结构程序设计
2020-10-18 14:17:30循环结构程序设计 1.基本的循环语句 1.1 while while(表达式) //—>循环条件 用一个变量去充当计数 { //表达式成立 一直循环 //去改变循环 } 1.2 do_while //无论条件成立与否,循环至少执行一次 do { //循环 }... -
do-while(0)的妙用
2020-05-12 09:32:37经常会遇到一段程序或者宏定义里面用到do-while(0),当时不知道为什么要这么用,既然只执行一次为何非要添加循环。 实际体会后才感觉这一步用的狠妙。有网友总结的挺好,贴出来。谢谢大神。 ... 在C++中,有三种类型的... -
do{}while(0)只执行一次无意义?你可能真的没理解!
2021-01-05 16:42:43然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的宏定义,比如do{}while(0)。 do{conditional code}while(condition)结构 流程图如下: 一般结构如以下代码 do { //循环体 } while (条件表达式);... -
do…while(0)的妙用
2012-06-20 08:57:18循环在程序中是不可少的,要么for, while...do,do...while, 但它都有自己的循环条件,在一些Linux的库中,MFC中常常会有do...while(0),或者do...while(FALSE)的宏,有什么用呢?不是用来循环,是用来提高代码的健壮... -
通过源码学习do{}while(0)的用法
2014-06-01 07:31:25至今我写程序从没用过do{}while循环和goto语句。但这个东西存在确实有它独特的用法,下面分享一篇文章。 在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能... -
关于do...while(0)在宏中的应用
2010-05-17 20:51:00这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会... -
java定时器只执行一次_do{}while(0)只执行一次无意义?你可能真的没理解!
2020-11-28 04:38:57然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的宏定义,比如do{}while(0)。do{conditional code}while(condition)结构流程图如下:一般结构如以下代码do{//循环体}while(条件表达式);do while/... -
scheduledexecutorservice 只执行一次_do{}while(0)只执行一次无意义?你可能真的没理解...
2020-12-05 00:47:14然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的宏定义,比如do{}while(0)。do{conditional code}while(condition)结构流程图如下:一般结构如以下代码do{//循环体}while(条件表达式);do while/w.... -
do{...}while(0)用途
2010-01-08 10:19:42这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈“。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会... -
循环结构讲解及练习 —2017/2/28—钱老师
2020-07-05 15:06:48在书写程序时,按运算级优先顺序空格,在if、else、for、while等语句后都要将后边语句写在花括号中,不然遇到宏会有很多语句,容易出错且难以发现(钱老师的深刻体会)。 for、while 、do-while 三个循环语句都可用... -
由linux中的一个宏定义引发的思考
2007-03-02 12:59:00有时候会在linux的程序中看到这样的宏定义:#define wait_event(wq,condition)/do{/if(condition)/break;/_wait_event(wq,condition);/}while(0)这里到底是在做什么呢?这个循环不是只作一次么?假设定义了这样的... -
c++ 程序设计
2019-01-20 22:53:373.11.2 用do-while语句构成循环 3.11.3 用for语句构成循环 3.11.4 几种循环的比较 3.12 循环的嵌套 3.13 break语句和continue语句 3.14 编写循环结构的程序 习题 第4章 函数与预处理 4.1 概述 4.2 定义函数的一般... -
单片机程序优化考虑的方向
2018-05-23 10:37:07来源网络 CSDN使用尽量小的数据类型 使用自加、自减指令 减少运算的强度 while 与do...while 的区别register 关键字 volatile 关键字 以空间换时间 宏函数取代函数 适当地使用算法 用指针代替数组 强制转换... -
Excel VBA程序设计.doc
2009-07-06 22:16:12Excel VBA程序设计.doc ...1.Do Loops: Do…While和Do…Until 130 2.观察过程执行 133 3.While…Wend循环 134 4.For…Next 循环 135 5.For Each…Next循环 136 7.提前跳出循环 137 8.循环嵌套 138 9.接下来… 138 -
ExcelVBA程序设计.doc
2011-04-05 21:32:511.DO LOOPS: DO…WHILE和DO…UNTIL 123 2.观察过程执行 126 3.WHILE…WEND循环 127 4.FOR…NEXT 循环 128 5.FOR EACH…NEXT循环 129 7.提前跳出循环 130 8.循环嵌套 131 9.接下来… 131 第七章 利用VBA数组管理数据... -
谭浩强c语言程序设计
2011-03-18 09:58:196.4 do-while语句 74 6.5 for语句 76 6.6 循环的嵌套 79 5 6.7 几种循环的比较 79 6.8 break和continue语句 79 6.8.1 break语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 ... -
Excel VBA程序设计 CHM格式 带全文检索
2008-11-26 23:40:05《Excel VBA程序设计》 ...1.Do Loops: Do…While和Do…Until 118 2.观察过程执行 121 3.While…Wend循环 121 4.For…Next 循环 122 5.For Each…Next循环 123 7.提前跳出循环 124 8.循环嵌套 125 9.接下来… 125 -
谭浩强版c语言程序设计
2013-05-16 11:37:266.4 do-while语句 74 6.5 for语句 76 6.6 循环的嵌套 79 5 6.7 几种循环的比较 79 6.8 break和continue语句 79 6.8.1 break语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 ... -
程序设计基础(C) 视频.txt
2019-05-25 10:23:242.6.1while语句与do-while语句48 2.6.2for循环语句50 2.6.3ifgoto实现循环功能51 2.6.4循环的嵌套52 2.7跳转语句53 2.7.1break语句54 2.7.2continue语句54 2.7.3break语句与continue语句的比较54 2.7.4goto语句55 ... -
csdn 翁恺 C 语言程序设计(完) 视频.txt
2019-05-24 17:21:15P344.1.3 循环:do-while循环 P354.2.1 循环应用:循环计算 P364.2.2 循环应用:猜数游戏 P374.2.3 循环应用:算平均数 P384.2.4 循环应用:整数求逆 P395.1.1 第三种循环:for循环 P405.1.2 第三种循环:循环的计算... -
C++程序设计谭浩强(清华大学).pdf
2012-02-13 22:36:363.4.3 dowhile结构 3.4.4 for结构 3.4.5 循环结构的中途退出与重复周期的中途结束 习题三 第4章 模块化程序设计 4.1 函数 4.1.1 设计C语言程序就是设计函数 4.1.2 函数结构 4.1.3 函数定义与函数声明 ... -
《C语言程序设计》谭浩强
2013-07-22 23:26:066.4 do-while语句 74 6.5 for语句 76 6.6 循环的嵌套 79 5 6.7 几种循环的比较 79 6.8 break和continue语句 79 6.8.1 break语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 ... -
谭浩强c语言程序设计(第3版)电子书
2010-04-05 21:22:266.4 do-while语句 74 6.5 for语句 76 6.6 循环的嵌套 79 5 6.7 几种循环的比较 79 6.8 break和continue语句 79 6.8.1 break语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维... -
MFC的程序框架剖析
2015-03-05 09:53:19(2)对于MFC程序,应用程序的实例是由全局对象(每一个MFC程序有且仅有一个从应用程序类CWinApp派生的类, 如CTestApp,它实例化theApp全局对象)来标识的 9、基类构造函数中this指针的指向问题 在构造子类对象时,会... -
谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar
2013-06-13 22:35:213.11.2 用do-while语句构成循环 3.11.3 用for语句构成循环 3.11.4 几种循环的比较 3.12 循环的嵌套 3.13 break语句和continue语句 3.14 编写循环结构的程序 习题 第4章 函数与预处理 4.1 概述 4.2 定义函数的一般...