精华内容
下载资源
问答
  • 2020-11-21 02:34:01

    C语言中的三种循环语言while、do……while、for,三种循环语句各有特点,用法也不尽相同。下面我们一一介绍。

    一:While语句

    While语句的基本形式是:

    while(判断语句){

    循环体}

    它的执行顺序是先进行逻辑判断,如果判断结果为真,则执行循环体。如果为假,则跳过循环体。流程图如下:

    8609090324ca3e65c09168cbd12dca85.png

    举个例子,如果判断语句为x>=5,而x等于6则程序进入循环直至循环语句使x进行逻辑判断为假,则循环结束。但如果你想在中途跳出循环的话,你也可以在循环体中加一个break。当程序遇到break则循环结束。

    二:Do while语句

    其基本形式为 do{循环体}

    while(判断语句)

    它与其它循环最大的区别在于,它先进行一次循环,再进行逻辑判断。可以看成是与while执行顺序相反。并且它的循环语句至少执行一次。流程图如下

    223d11806b5d169c3759750eac1f7210.png

    三:For语句

    在我看来for语句是三个循环语句中最复杂的一个。它的基本形式为

    for(表达式一,表示式二,表达式三)

    {循环体}

    其实表达式一充当的是一个循环准备功能,表达式二是条件判断(表达式二一般是一个判断语句),式三是循环调整。流程图如下

    09d9c9c95eb6769ed5a17f0840c85cf2.png

    执行完式一后,其实就是式二、循环体与式三之间的循环进行。

    更多相关内容
  • C语言提供了好几种循环结构,即while、for和do-while。汇编语言中并没有相应的指令存在,作为替代,将条件测试和跳转组合起来实现循环的效果。大多数汇编器根据一个循环的do-while形式来产生循环代码,即使在实际...

    C语言提供了好几种循环结构,即while、for和do-while。汇编语言中并没有相应的指令存在,作为替代,将条件测试和跳转组合起来实现循环的效果。大多数汇编器根据一个循环的do-while形式来产生循环代码,即使在实际程序中这种形式用的相对较少。其它的循环会首先转换成do-while形式,然后再编译成机器代码。

    do-while循环

    其通用形式是这样的:

    do body-statementwhile (test-expr);

    循环的效果就是重复执行body-statement,对test-expr求值,如果求值的结果为非零,就继续循环。注意,body-statement至少执行一次。

    do-while的通用形式可以翻译成如下所示的条件和goto语句:

    loop:

     body-statement t = test-expr; if(t) goto loop;

    也就是说每次循环程序会执行循环体里面的语句,然后执行测试表达式。如果测试为真,则回去再执行一次循环。

    下面示例用do-while循环计算函数参数的阶乘,写作n!只计算n>0时候n阶乘的值:

    int fact_do(int n){ int result = 1; do { result *= n; n = n - 1; }while(n > 1); return result;}
    11ab9cc8b02f77b6de88587f1879fb5f.png

    汇编代码是do-while循环的一个实现形式,这里用的gcc编译器

    gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)

    编译参数是

    $ gcc -m32 -O2 -o fact

    因为非常不习惯AT&T汇编形式,所以这里用IDA pro 对得到的fact文件进行反汇编分析,原文的汇编形式(用edx保存参数n)我无论怎么调节参数都无法得到。图中是一个do-while循环的标准实现,eax初始化为1,epb+8地址处保存着参数n,0x08048404 处把参数n减一,紧接着0x08048408 处把n与1比较。如果为真则在0x0804840C处跳回循环的开始,这里是循环的关键地方由它来判断循环是继续还是退出。

    综合0x080483F3,0x080483FA我们可以看到eax被初始化为1,在0x080483FD被乘法更新。如果学过x86汇编语言就知道 mul 乘法指令是离不开eax寄存器的,而且返回值通常也用eax寄存器。所以这里eax对应于结果result是无悬念的。

    理解产生的汇编代码与原始代码之间的关系,关键是找到程序值和寄存器之间的映射关系。对于循环fact_do来说,这个任务非常简单,但是对于更复杂的程序来说,就可能是更具挑战性的任务。C语言编译器常常会重组计算,因此有些C代码中的变量在机器代码中没有对应的值;而有时,机器代码中又会引入源代码中不存在的新值。此外编译器还常常试图将多个程序值映射到一个寄存器上,来最小化寄存器的使用率。 上面的fact_do的过程对于逆向工程循环来说,是一个通用的策略。看看在循环之前如何初始化寄存器,在循环中如何更新和测试寄存器,以及在循环之后又如何使用寄存器。这些步骤中的每一步都提供了一个线索,组合起来就可以解开谜团。做好准备,你会看到令人惊奇的变换,其中有些情况很明显是编译器能够优化的代码,而有些情况很难解释编译器为什么要选用那些奇怪的策略。

    while循环

    while语句的通用形式如下:

    while(test-expr) body-statement

    与do-while不同的是,它对test-expr求值,在第一次执行body-statement之前,循环就可能中止。将while循环翻译成机器代码有很多种方法。一种常见的方法,也就是GCC采用的方法,是使用条件分支,在需要时省略循环体的第一次执行,从而将代码转换成do-while循环,如下:

    if(!test-expr) goto done;do  body-statementwhile(test-expr);done:

    接下来这个代码可直接翻译成goto代码,如下:

     if t = test-expr if(!t) goto done;loop: body-statement t = test-expr; if(t) goto loop;done:

    使用这种策略,编译器常常会优化最开始的测试,比如说认为总是满足测试条件。

    举个例子fact_while是使用while循环的阶乘函数的实现,这个函数能正确的计算 0!=1 。fact_while_goto是GCC产生的汇编代码的C语言翻译,比较fact_do 和fact_while 我们看到它们几乎是相同的。将while循环转换成do-while循环,以及将后者翻译成goto代码。

    int fact_while(int n){ int result = 1; while(n > 1){ result *= n; n = n - 1; } return result;}
    int fact_while_goto(int n){ int result = 1; if(n <= 1) goto done; loop: result *= n; n = n - 1; if(n > 1) goto loop; done: return result;}
    2e732b488464a487ce207a4beff175b2.png

    for循环

    for循环的通用形式如下

    for(init-expr;test-expr;update-expr) body-statement

    C语言标准说明,这样一个循环的行为与下面这段使用while循环代码的行为一样:

    init-expr;while(test-expr) { body-statement update-expr;}

    程序首先对初始表达式init-expr求值,然后进入循环;在循环中它先对测试条件test-expr求值,如果测试结果为“假”就会退出,否则执行循环体body-statement;最后对更新表达式update-expr求值。

    这段代码编译后的形式,基于前面讲过的从while到do-while的转换,首先给出do-while的形式:

    init-expr;if(!test-expr) goto done;do{ body-statement update-expr;}while(test-expr);done:

    然后将它转换成goto代码:

     init-expr; t = test-expr if(!t) goto done;loop: body-statement update-expr; t = test-expr; if(t) goto loop;done:

    作为一个示例,考虑用for循环写的阶乘函数:

    int fact_for(int n){ int i; int result = 1; for(i = 2;i <= n; i ++) result *= i; return result;}

    如上述代码所示,用for循环编写阶乘函数最自然的方式就是将从2一直到n的因子乘起来,因此这个函数与我们使用while或者do-while循环的代码都不一样。

    这段代码中for循环的不同组成部分如下:

    d3387b51f1acc835f723566713394545.png

    用这些部分带入前面给出的模板中的相应位置,得到下面goto代码的版本:

    int fact_for_goto(int n){ int i = 2; int result = 1; if( !(i <=n ) ) goto done; loop: result *= i; i ++; if(i <= n) goto loop; done: return result;}

    确实仔细查看GCC产生的汇编代码会发现非常接近如下形式:

    bbb768bb9974380b719e2e322d944a07.png

    综上所述,C语言中三种形式的所有循环— do-while,while和for–都可以用一种简单的策略来翻译,产生包含一个或多个条件分支的代码。控制的条件转移为循环翻译成机器代码提供了基本机制。

    死循环选择for还是while

    最后再说一下,看到有人在网上讨论死循环用 for(;;); 好,还是用 while(1); 好。

    自己亲自测试了下,在 -O2 参数下它们生成的汇编指令是一样的(看来这应该跟优化配置和编译器选择有很大关系)。

    89ce70b549def36bfc7241b13c25e094.png
    展开全文
  • 上一章我们讲了while和do...while循环,这一章我们来学习一下C语言中的另外一种循环结构:for循环。我们先来看一下for循环的结构:for(expression1;expression2;expression3){statement}在关键字for之后的圆括号中...

    上一章我们讲了while和do...while循环,这一章我们来学习一下C语言中的另外一种循环结构:for循环。

    我们先来看一下for循环的结构:

    for(expression1;expression2;expression3)

    {

    statement

    }

    在关键字for之后的圆括号中包含了由两个分号分开的三个表达式。

    · expression1是初始化,它在for循环开始的时候执行一次;

    · expression2是判断条件,在每次执行循环之前都要对它进行求值,当expression2为假时,循环就结束了。

    · expression3进行条件更新,它在每次循环结束时进行计算。

    在for循环中expression1,expression2,expression3每一个都是完整的表达式,任意一个控制表达式的任何作用都在程序求下一个表达式的值之前生效。

    还记得我们上一章的那个例子么:打印出大于0并且小于100的整数。

    那么我们如果用for循环,应该怎么来实现这个例子呢,看下图:

    78d6878940eb5beb30fbf7e53ec25962.png

    那么我们就按照上图,用for循环把这个例子来实现一下:

    dc7305832fc47c2169295cc1c8362b54.png

    从上面这个例子中我们可以很清楚的看到for循环的3个部分,第一个将i初始化,第二个对i的值进行判断,若为真则循环,为假则跳出,第三个对i进行自增,改变循环条件。

    看了这个例子大家应该对for了解了,那么我们在for循环进行扩展下,假如说我不只是要打印0到100的整数,我还需要在打印0到100整数的时候同时打印100到0的整数。

    那么这个例子我们怎么用for循环来解决呢,不知道大家还记不记得讲运算符时候有个逗号运算符,在这里我们就需要用到逗号运算符来完成,废话不多说,还是上代码:

    e1081621bdac6bc2e24926c37973ab73.png

    for循环还有一些变形体,我就用上面的那个例子把一些简单的变形体列一下:

    ec0de77514d0577a6613d128a6c4c7d3.png

    好了讲到这里我们for循环也讲完了,那么在while、do...while、for中我们在需要循环时,应该使用哪一种呢?

    · 首先要确定需要入口条件循环还是退出条件循环。通常我们选择入口条件循环,首先一般情况下在循环开始的地方进行循环判断,可读性更强,并且如果一开始就不满足条件,那么就可以直接跳过整个循环了。

    · 那么如果是入口条件循环,应该选for还是while呢?这个还是要看个人爱好,因为这两个循环做的事情都是相同的for(;expression;)这种情况和while(expression)是一样的;当然在循环涉及到初始化和更新变量时使用for循环比较方便,其他的可能while用的方便点:比如while (scanf("%d

    展开全文
  • 接着使用“穷举法”来找兔子,通过循环结构进行穷举,设最大寻找次数为1000次。由于洞只有10个,因此第n次查找对应第n%10个洞,如果在第n%10个洞中没有找到兔子,则将数组元素a[n%10]置0。 当循环结束后,再检查a...

    问题描述

    一只兔子躲进了10个环形分布的洞中的一个。狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找;也没有找到,就隔2个洞,到第6个洞去找;以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中?

    问题分析

    首先定义一个数组a[11],其数组元素为a[1],a[2],a[3]……a[10],这10个数组元素分别表示10个洞,初值均置为1。

    接着使用“穷举法”来找兔子,通过循环结构进行穷举,设最大寻找次数为1000次。由于洞只有10个,因此第n次查找对应第n%10个洞,如果在第n%10个洞中没有找到兔子,则将数组元素a[n%10]置0。

    当循环结束后,再检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身于该洞中。

    下面是程序流程图:

    60ded27c79c0db030c07e2c5bdaaa3c6.png

    下面是完整代码:

    #include 

    运行结果:

    可能在第2个洞

    可能在第4个洞

    可能在第7个洞

    可能在第9个洞

    e1d289eaaeff5516139f58f73b5a9bde.png

    自学C/C++不易,此路应携手前行。

    如果你想跟着小编一起学编程的话!

    可以来我的C语言/C++编程学习基地,【点击进入】!

    还有(源码,零基础教程,项目实战教学视频)【进入领取】!

    9d1ce144f3e1f7dd691a3cff591c240f.png

    115f0b8ee365db54ce64b5f5e553da87.png
    展开全文
  • 使用C语言编写程序对数据进行排序C语言是一种强大的编程软件,使用十分广泛,用户众多,也是学习其他语言的基础...涉及的知识点有输入语句(scanf)、输出语句(printf)、数组知识、循环结构(for)、分支结构(if),还有...
  • C语言概述C语言的执行速度快,执行效率高,功能强大,编程自由。 但缺点也是有的,代码实现的周期较长,可移植性较差, 由于过于自由,模块的操作单一(历史性原因)。 因为C语言是底层代码,所以需要了解计算机的基本...
  • c语言分享会 2020年11月11日下午4.30,IT学研会开展了第三次C语言系列知识分享会,由杨宗儒师兄先讲解上次分享会留下来的拓展程序的编写及运用。... 到了分享会的下半段,由陈秋兰师姐解读for循环语句的...
  • #include<stdio.h> int main(void) { int i, j;... for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) a[i][j] = i + j; } /*按照矩阵的形式输出*/ for (i = 0; i < ...
  • for循环是编程语言中一种开界的循环语句,而循环语句由循环体及循环的终止条件两部分组成,for循环一般形式为:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。执行的中间循环体可以为一个语句,也可以为多...
  • 系列文章《C语言经典100例》持续创作中,欢迎大家的关注和支持。喜欢的同学记得点赞、转发、收藏哦~后续C语言经典100例将会以pdf和代码的形式发放到公众号欢迎关注:计算广告生态 即时查收1 题目函数:fun()功能:...
  • for(i = 1;i<=5;i++)//打印高度为5的数字金字塔 { for(j = 1;j <= 5-i;j++)//打印空格 { printf(" "); } for(j=1;j<=i;j++)//打印随高度递增数字 printf("%2d",j); for(j = i-1;j>=.
  • #include <stdio.h> int main() { int i, j, k; for(i=1; i<5; i++) { for(j=i;j<5;j++) { printf(" "); //输出空格 } for(k=0;k<2*i-1;k++) { printf("*".
  • 1. for循环 2. 全局变量和局部/本地变量: 静态本地变量 3.函数 3.1 有返回值的函数: 3.2 没有返回值的函数: 3.3函数参数 形参和实参: (1)传值: (2)传指针: 4. 数据类型 选择整数类型 浮点的...
  • C语言:数组和for循环

    千次阅读 2020-02-06 15:59:43
    数组: 分为:1 数组,2 数组的数组; 数组的数组: ...数组符号:[ ] 和数组是没有关系的。...所谓数组为2的有3个就是把内存好比为房间,int hoge[3][2]就是有3...如此数组便也是清晰明了了,对于for循环也是明白了
  • for和双重for循环的用法和案例举例

    千次阅读 2020-08-16 15:02:23
    7.1 for循环 ​ for ( 初始化变量;条件表达式;操作表达式){ //循环体 } 1.初始化变量:就是用var 声明的一个普通变量,在循环(代码块)开始之前执行。通常用于计数器的使用。可以不写。 2.条件表达式 就是用来...
  • for(i=0;i;i++){ printf("0"); for(j=0;j;j++){ printf("1"); } } } 汇编: main: .LFB24: pushl %ebp movl %esp, %ebp pushl %ebx andl $-16, %esp subl $16, %esp movl $5, %ebx .L3: movl $48, (%...
  • C语言双重循环的几种用法

    千次阅读 2020-11-21 15:15:20
    双重循环的灵活应用以及部分变量的及时清零
  • C语言】自己思考和动手所写出的for循环生成实心函数的历程和源码,希望可以帮到初学者。
  • 1 * 1 = 11 * 2 = 2 2 * 2 = 41 * 3 = 3 2 * 3 = 6 3 * 3 = 91 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 161 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 *...
  • c语言for循环如何打印菱形

    千次阅读 2021-08-29 00:09:42
    c语言for循环打印菱形的方法:使用两个for循环,实现条件判断,代码为【int i,j;for(i=0; i<2*n-1; i )_(i=n-i-1&&jc语言f...
  • c语言双重循环 输出如下图形~!!

    千次阅读 2021-05-22 03:15:15
    满意答案//1#include...for(int i=0;i<4;i++){printf("\n");for(int j=0;j<18;j++)printf("%c",a);}printf("\n");}//2、你这个图形应该是给错了的#includevoid main(){char a='*';for(int i=1;i<=5;i++)...
  • 双重for循环优化

    千次阅读 2020-12-28 10:18:30
    双重for循环优化 双重for循环优化思想:主要是将某一层的数据转成map类型,用比较字段去map里面get,若拿到数据则匹配上了 由于是在云上开发,代码拿不下来(公司限制了),就只能截图了,希望读者将就着看。 ...
  • #include &lt;stdio.h&gt; int main() { int a[10]={14,2,3,44,5,6,7,8,9,... for(i=1;i&lt;10;i++){ for(t=a[i],j=i-1;j&gt;=0&amp;&amp;t&lt;a[j];j--){ a[j+1]=a[j]; } j+...
  • 本关任务:编写一个程序,学生一起买小吃,共花钱50元,其中每个大学生花3元,每个中学生花2元,每个小学生花1元。现输入学生总人数30,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生数...用双重循环
  • C语言for语句循环[转]

    2021-05-18 12:23:03
     } 程序说明: for循环变量用于控制循环次数,可以换成for(i=1;i;i++) 2. 国际象棋棋盘有64格,若在第1格放1粒谷;第2格放2粒谷;第3格放4粒谷;第4格放8粒谷……如此一直放到第64格。假设2000000粒谷有一顿重,问...
  • C语言第三课 for循环例子.doc下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档,不会出现我们的网址水印。3、该文档所得收入(下载+...
  • #include<stdio.h> int main(){ int i,j; for(i=1;i<10;i++){ for(j=1;j<=i;j++){ printf("%d*%d=%d ",i,j,i*j); } printf("\n"); } return 0; }
  • for 循环的执行过程【可以debugger到谷歌浏览器断点就可以更清晰这执行过程】 1. 首先执行变量 var i = 1;( 这语句在for 循环只执行一次 ) 2. 此时i=1 到i <= 3来判断是否满足条件,1小于3,满足条件 就去...
  • Visual Studio 2015中的for循环语句还可以使用逗号,该怎么使用逗号呢?下面我们就来看看详细的教程。软件名称:Visual Studio 2015 简体中文正式版(企业版)软件大小:4.5GB更新时间:2016-09-17立即下载首先,定义...
  • 【摘要】循环结构是结构化程序设计中的三大基本控制结构之一,也是程序员学习程序设计时最为难以理解的部分。...本文以C语言for循环应用为例讲解多重循环的学习思路和方法。【关键字】多重循环,for...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,825
精华内容 1,930
关键字:

c语言双重for循环

友情链接: openglFramework.rar