精华内容
下载资源
问答
  • 循环指令(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 ........

          每天学习一点点,进步一点点e296e8baa611d5ca63d607d74022c093.pnge296e8baa611d5ca63d607d74022c093.pnge296e8baa611d5ca63d607d74022c093.pnge296e8baa611d5ca63d607d74022c093.pnge296e8baa611d5ca63d607d74022c093.pnge296e8baa611d5ca63d607d74022c093.png

    Anything is possible

    展开全文
  • 同时因为绝大多数的编译器都能够识别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 2

    bool 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结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会...

     这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的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是不可能的 

    展开全文
  • 循环结构程序设计 1.基本的循环语句 1.1 while while(表达式) //—>循环条件 用一个变量去充当计数 { //表达式成立 一直循环 //去改变循环 } 1.2 do_while //无论条件成立与否,循环至少执行一次 do { //循环 }...
  • do-while(0)的妙用

    2020-05-12 09:32:37
    经常会遇到一段程序或者定义里面用到do-while(0),当时不知道为什么要这么用,既然只执行一次为何非要添加循环。 实际体会后才感觉这一步用的狠妙。有网友总结的挺好,贴出来。谢谢大神。 ... 在C++中,有三种类型的...
  • 然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的定义,比如do{}while(0)。 do{conditional code}while(condition)结构 流程图如下: 一般结构如以下代码 do { //循环体 } while (条件表达式);...
  • dowhile(0)的妙用

    2012-06-20 08:57:18
    循环程序中是不可少的,要么for, while...do,do...while, 但它都有自己的循环条件,在一些Linux的库中,MFC中常常会有do...while(0),或者do...while(FALSE)的,有什么用呢?不是用来循环,是用来提高代码的健壮...
  •  至今我写程序从没用过do{}while循环和goto语句。但这个东西存在确实有它独特的用法,下面分享一篇文章。  在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能...
  • 这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会...
  • 然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的定义,比如do{}while(0)。do{conditional code}while(condition)结构流程图如下:一般结构如以下代码do{//循环体}while(条件表达式);do while/...
  • 然而,在很多的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结构呢?我曾一度在心里把它叫做“怪圈“。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会...
  • 在书写程序时,按运算级优先顺序空格,在if、else、for、while等语句后都要将后边语句写在花括号中,不然遇到会有很多语句,容易出错且难以发现(钱老师的深刻体会)。 for、whiledo-while 三个循环语句都可用...
  • 有时候会在linux的程序中看到这样的定义:#define wait_event(wq,condition)/do{/if(condition)/break;/_wait_event(wq,condition);/}while(0)这里到底是在做什么呢?这个循环不是只作一次么?假设定义了这样的...
  • c++ 程序设计

    2019-01-20 22:53:37
    3.11.2 用dowhile语句构成循环 3.11.3 用for语句构成循环 3.11.4 几种循环的比较 3.12 循环的嵌套 3.13 break语句和continue语句 3.14 编写循环结构的程序 习题 第4章 函数与预处理 4.1 概述 4.2 定义函数的一般...
  • 来源网络 CSDN使用尽量小的数据类型 使用自加、自减指令 减少运算的强度 whiledo...while 的区别register 关键字 volatile 关键字 以空间换时间 函数取代函数 适当地使用算法 用指针代替数组 强制转换...
  • Excel VBA程序设计.doc

    2009-07-06 22:16:12
    Excel VBA程序设计.doc ...1.Do Loops: DoWhileDo…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:51
    1.DO LOOPS: DOWHILEDO…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:19
    6.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程序设计》 ...1.Do Loops: DoWhileDo…Until 118 2.观察过程执行 121 3.While…Wend循环 121 4.For…Next 循环 122 5.For Each…Next循环 123 7.提前跳出循环 124 8.循环嵌套 125 9.接下来… 125
  • 6.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 ...
  • 2.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 ...
  • P344.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:36
    3.4.3 dowhile结构 3.4.4 for结构 3.4.5 循环结构的中途退出与重复周期的中途结束 习题三 第4章 模块化程序设计 4.1 函数 4.1.1 设计C语言程序就是设计函数 4.1.2 函数结构 4.1.3 函数定义与函数声明 ...
  • 6.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:26
     6.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指针的指向问题 在构造子类对象时,会...
  • 3.11.2 用dowhile语句构成循环 3.11.3 用for语句构成循环 3.11.4 几种循环的比较 3.12 循环的嵌套 3.13 break语句和continue语句 3.14 编写循环结构的程序 习题 第4章 函数与预处理 4.1 概述 4.2 定义函数的一般...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 157
精华内容 62
关键字:

do循环宏程序while