精华内容
下载资源
问答
  • <div><p>1、死循环的原因是“没有给(变量a)设置一个限制”,或者“没有让a跳出限制”,如a=a+1。。 2、while不执行的原因可能是条件限制太大 3、while1+while2语句这种嵌套式...
  • public class WhileTest { private boolean flag = true; public void setFlag(boolean flag) { this.flag = flag; } public void say() { while(flag) { } System.out.println("--------------...

    直接看代码

    public class WhileTest {
    	private boolean flag = true;
    	public void setFlag(boolean flag) {
    		this.flag = flag;
    	}
    	public void say() {
    		while(flag) {
    		}
    		System.out.println("--------------线程停止------------------------------------");
    	}
    	public static void main(String[] args) throws InterruptedException {
    		final WhileTest wt = new WhileTest();
    		Thread t = new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				wt.say();
    			}
    		});
    		t.start();
    		Thread.currentThread().sleep(500);
    		wt.setFlag(false);
    	}
    }
    

     

    很明显,会出现死循环,因为主线程修改共享变量的值,另一个线程并且读取到修改

    常见的解决方案是
     flag  加上volatile关键字,强制刷新共享变量的值和主内存的值一致。

    但是,如果在while循环体中加上一段输出语句,也能够停止线程,原因在哪里,看下源码

    public void say() {
    		while(flag) {
    			System.out.println("");
    		}
    		System.out.println("--------------线程停止------------------------------------");
    	}
     public void println(String x) {
            synchronized (this) {
                print(x);
                newLine();
            }
        }

     原来是因为,输出语句的内容,有一个同步代码块,进入、离开同步代码块,都会和主内存的共享变量的值保证一致,从而实现了可见性。

    其实,如果while循环内,加上Thread.sleep语句,给CPU一段时间,cpu会去同步主内存和工作内存的共享变量的值,也能够停止死循环,不过不推荐这样实现,存在不确定性。

     

    展开全文
  • !... ...甚至于,如果在while循环体中,加入任意的打印语句(如换行符,空格,制表符等等),都可以使程序不卡死,求解 _(我知道解这道题有更简单的方法,但是我想知道这种写法卡死的原因,谢谢大佬)_
  • 死循环:由于程序员的原因,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止的循环! while循环 根据判断条件确定一段程序是否再次执行一次或者多次 使用方法: while (<条件>): <...

    循环语句

    • 控制程序的语句;
    • 重复执行程序中的某段代码可以使用循环语句。

    死循环:由于程序员的原因,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止的循环!

    while循环

    • 根据判断条件确定一段程序是否再次执行一次或者多次

    使用方法:

    while (<条件>):
        <语句快1>
    else:
        <语句块2>
    <语句块3>    
    

    当条件为True(真)时,执行语句块1,为False(假)时,退出循环。

    # 计算1~100之间偶数的累积和(包含1和100)
    num = 1
    result = 0 # 保存每次累加的偶数的和
    # 循环生成1-100的数字
    while num <= 100:
        # 循环判断数字是否是偶数
        if num % 2 == 0:
            # print(num)
            # 累加偶数和, 加等每次生成的偶数
            result += num
        num += 1
    print("偶数和:", result)
    

    for循环

    • 像while循环一样,for可以完成循环的功能。
    • for循环可以遍历容器类型(任何序列)的数据,比如:字符串、列表、字典、元组、集合

    使用for循环语句可以循环遍历整个序列的内容:

    for <迭代变量> in <序列>:
        <代码块1>
    else:
        <代码块2>
    <代码块3>    
    

    循环变量x在每次循环时,被赋值成对应的元素内容
    range()函数相关本文档搜索

    for与while循环的区别

    • for循环的次数固定,即所遍历的序列长度
    • while为无限循环

    小总结

    1. while和if的用法基本类似,区别在于:if条件成立,则执行一次;while 条件成立,则重复执行,直到条件不成立为止。
    2. 一般情况下,需要多次重复执行的代码,都可以用循环的方式来完成。
    3. 循环不是必须要使用的,但是为了提高代码的重复使用率,所以有经验的开发者都会采用循环。

    循环的终止(控制)

    注意点: break和continue只能在循环语句里面的使用,不能单独使用

    1. countinue:跳过余下代码
    2. break:退出循环
    3. pass:占位

    break语句

    • 终止break所在的循环,break后面的代码不会执行。
    for i in range(10):
        if i%2 == 0:
            break
        print(i)
    

    continue语句

    • 只终止本次循环,而不终止整个循环的执行;然后可以继续执行下一次循环,continue后面的代码不会执行。
    for i in range(10):
        if i%2 == 0:
            continue
        print(i, end=' ')
    Out:1 3 5 7 9
    

    pass语句

    • pass:占位,逻辑上并没有作用,但可以保证代码规范不报错。
    try:
        <代码块>
    except Exception as err:
        # 不像在异常中执行任何操作,不写代码会报错,利用pass占位
        pass 
    

    循环语句的else用法

    • for…else, while…else,是Python特有的语句,当且仅当循环体正常结束,elas才会执行。
    • 由break强制结束的,else不会执行。
    • 由continue结束的,else还会执行。

    此种语法的应用

    # 在字符串中查找指定数据,如果找到了打印指定数据,没有找到输出该字符不存在
    my_str = "hello"
    for value in my_str:
        print(value)
        if value == "e":
            print("找到了:%s" % value)
            # 只要循环语句没有执行break,那么else语句就会执行
            break
    else:
        print("没有找到")
    
    展开全文
  • while循环 1.语法 当…时 while(表达式){ 语句 } ...死循环原因:浮点数不精确 var a = 0.1 while(a !== 1){ console.log(a) a = a + 0.1 } for循环 1.语法糖 for 是 while 循环的方便写法 方便的地方: while

    while循环

    1.语法
    当…时

    • while(表达式){ 语句 }
    • 判断表达式的真假
    • 当表达式为真,执行语句
    • 当表达式为假,执行后面的语句
    • 执行完再次判断表达式的真假
      在这里插入图片描述
      2.奇怪的例子
      死循环案例:
      当 a 不等于 1 时,打印出 a,且 a = a+1
      死循环原因:浮点数不精确
    var a = 0.1
    while(a !== 1){
        console.log(a)
        a = a + 0.1
    }
    

    在这里插入图片描述

    for循环

    1.语法糖

    • for 是 while 循环的方便写法
    • 方便的地方:
      while的几个部分少一个都不行
    var a = 0.1 //初始化
    while(a !== 1){  //判断
        console.log(a)  //循环体
        a = a + 0.1  //增长
    }
    

    2.语法

    • 结构
    for(语句1;表达式2;语句3){//初始化;判断;增长
      循环体
    }
    
    • 先执行一次语句1
    • 然后判断表达式2
    • 如果为真,执行循环体,然后执行语句3(注意先后顺序)
    • 如果为假,直接退出循环,执行后面的语句

    3.重要的栗子
    例子1:
    在这里插入图片描述
    例子2

    for(let i= 0; i<5;i++){
    setTimeout(()=>{console.log(i)})
    }
    

    2.1为什么运行结果会有5个5?
    答:

    • setTimeout表示过一会执行,虽然跳过了这一句,但后面一定会执行,这里 i 从 0-4一共5次,因此是5个
    • “过一会”表示把循环执行完了之后执行,则当循环执行完时,i=5
    • 因此是5个5
      在这里插入图片描述
      2.2 如何解决这个问题,正常打印出 ·0,1,2,3,4
      答:把var改成let,是JS为了满足一些程序员的思想,单独开辟的运行理念
      在这里插入图片描述

    break和continue

    退出当前所有循环 V.S. 退出当前一次循环

    • break退出整个循环,但只会退出离它最近的一个for

    在这里插入图片描述
    在这里插入图片描述

    label标签

    foo: { //foo是一个标签,表示这个代码块
      console.log(1);
      break foo;//跳出foo这个代码块
      console.log('本行不会输出');//上面就已经退出了
    }
    console.log(2);
    

    最终会输出;1 2

    {
    foo: 1;
    }
    

    表示一个代码块,代码块里面有一个标签,标签label的内容是1,这不是一个对象

    var a = {
      foo: 1;
    }
    

    这是一个对象

    推荐书籍:你不知道的JavaScript

    展开全文
  • 如何写好while和for循环

    千次阅读 2012-11-07 10:56:46
    产生死循环的主要原因是continue、goto等跳转语句的存在,因为这些跳转可能恰巧跳过了更新循环条件的地方。也许有人认为这种问题是一个正常的码农不会犯这种错误,但是,在有些条件下,真的会发生。 这些条件也可以...

    这是编程语言的一个基本问题,其实要点无非三个:

    • 除非在刻意的情况下,避免死循环
    • 有效的循环
    • 保证循环的边界条件正确

    产生死循环的主要原因是continue、goto等跳转语句的存在,因为这些跳转可能恰巧跳过了更新循环条件的地方。也许有人认为这种问题是一个正常的码农不会犯这种错误,但是,在有些条件下,真的会发生。
    这些条件也可以简单的概括为以下两点:
    1. 过长的循环体,在增加了跳转语句之后产生更新循环条件的错误会大大增加
      解决方案:重构代码,缩减循环体的长度
    2. 不一致的更新条件:该问题指的是循环条件的更新条件在循环体中不同,例如在遍历vector,并且做删除操作的时候,这时候,如果使用迭代器,循环的更新有两种,一种是符合条件删除之后由erase函数返回的新迭代器,另外一种是不符合条件迭代器的自增操作。
      解决方案,在每一个跳转之前,想一想,是不是要加一个迭代器自增的操作,加么?加么?加么?数个三次,基本上就bug free了。
      另外,在这种使用迭代器做删除操作的时候,需要注意的是,在循环结束的判断不要使用保存了的end()对象,因为做了删除操作之后,end()会失效!!!
    有效循环的要点是在循环中做好充分的剪枝操作,因为,循环基本上是时间开销最大的产生点,几个简单的剪枝操作可能会对程序的执行速度产生很大的影响。

    最后,则是保证循环边界条件的正确性,对这一点,就不展开叙述了,因为,每一个coder在设计循环的时候,都需要用边界条件做一个简单的测试,不是么~

    展开全文
  • while语句的一般表达式为:while(表达式){循环体}。 循环的作用就是让 指定的代码 重复的执行 while 循环最常用的应用场景就是 让执行的代码 按照 指定的次数 重复 执行 基本语法 死循环 由于程序员的原因,忘记 ...
  • 死循环的标准格式: while(true){ 循环体 } 这个跟上图的for输入结果是一样的。 死循环里面有一个错误的写法,就是,死循环下面写了一个执行语句。 如图,Java第十行报错,为什么报错? 这里显示错误原因是,不...
  • 死循环,一经触发就会永远运行下去。 continue & break 如果在循环过程中,因为某些原因,你不想继续循环了,就要用到break 或 continue语句。 # break用于完全结束一个循环,跳出循环体执行循环后面...
  • 关于if条件判断为真但不执行if块语句的问题,我一直也还不是很清楚是什么原因...在这样调试的时候,会发现当if逻辑判断为真的时候却没能进入if块内语句执行,只仅仅死循环if判断,问题是我并不知道造成这样问题的原因
  • 有两种写死循环的方式,即:for(; ;)和while(1),但是这两种哪个效率? 首先要说明的是两者之间的效率高低最重要的还是取决于编译器是否有优化! 当编译器对程序不做优化时,两者的效率高低都差不多,编写...
  • 浅谈:C/C++中for( ; ; )和while(1)区别

    千次阅读 2018-08-04 14:56:21
    有两种写死循环的方式,即:for(; ;)和while(1),但是这两种哪个效率高呢?其实也说不准,今天我来和大家简单说一下吧! 首先要说明的是两者之间的效率高低最重要的还是取决于编译器是否有优化! 当编译器...
  • for循环相比while循环,for循环的三个必要条件(初始化、判定、更新)由于风格原因,三个部分距离较近,便于查找修改。 for循环的常见问题 死循环 1.判断条件设置错误 2.数组越界导致条件变量数据被覆盖修改 如
  • 奇奇怪怪错误原因

    2021-01-24 13:03:35
    7.While前面写自变量是j,括号里循环条件变成了关于i,导致陷入了死循环,不出结果。 8.忘记给while循环设置出口 9.Main写成mian。显示错误语句:ld returned 1 exit status 扩展: 10.第...
  • 一、说出下列两个循环的优缺点,并说明原因 答: 左侧程序 优点:程序简洁 缺点:多执行了N-1次逻辑判断,并且打断了循环“循环流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。 右侧程序 优点:循环...
  • 前言 多线程使用必然涉及到线程间通信 ... 原因:不断使用while语句轮询检测某个条件,会浪费cpu。轮询时间间隔小,更浪费cpu资源 解决:实现线程间通信,使用等待/通知机制 等待通知机制简介 举...
  • 这样会陷入死循环原因是p是指针,它值是地址,例如char * p = "asdfsdafsd "; 但是p != 'a ', 而是0x1010010(举例)  所以应将while语句P!=NULL改为 *p!=NULL。
  • 关于ble产品出现死机时问题分析 最近做一个ble产品,在开发过程中出现了概率性极低死机现象,大概2%,很是头痛。... While死循环里面有喂狗语句:这个看门狗处理不了。我看了程序,应用端代码里面...
  • python学习总结day4

    2020-07-12 09:21:24
    ** 循环 ** 01程序的三大流程 在程序开发中,一共有三种流程方式: 顺序——从上向下,顺序执行代码 分支——根据条件判断,决定执行代码的分支 循环——让特定的代码重复执行 ...死循环:由于程序员的原因,忘记
  • 提交时常见错误

    2017-06-05 20:42:20
    1.Output Limit Exceed ...你程序发生上述错误主要原因循环语句while(scanf("%d",&n))产生。 2.memory limit exceed 所用内存超出限制; 3.Presentation Error (1).格式错 ( Presentation
  • 1.Output Limit Exceed ...你程序发生上述错误主要原因循环语句while(scanf("%d",&n))产生。 也有可能是输入字符时未使用getchar()缓冲 2.memory limit exceed 所用内存超出限制; 3.Presentation
  • 问题的原因while(connected) { String str=dis.readUTF(); System.out.println(str); } 不断循环执行,一直在死循环获取socket发送的信息, 使得前面的语句 s = ss.accept(); connect
  • MDK警告:statement is unreachable

    千次阅读 2018-11-12 08:54:23
    出现这种情况的原因是,前面有个死循环,编译器认为程序执行不到这里。 一般出现这种情况是因为前面有while(1)死循环或者for死循环,程序在这里卡死,所以后面的语句执行不了 这种警告不会影响程序的运行,但是...
  • 问题的原因while(connected) { String str=dis.readUTF(); System.out.println(str); } 不断循环执行,一直在死循环获取socket发送的信息, 使得前面的语句 s = ss.accept(); con...
  • 程序发生上述错误主要原因循环语句while(scanf("%d",&n))产生。因为scanf函数当有输入数据时,返回值是读入数据个数。当没有输入数据时,返回值是-1(预定义为EOF)。例如本程序是读入一个n值,读入...
  • 各种容易假死的情况,原因在于主exe在读取共享空间时候会判断一个标志位,来知道调用exe有没有往里写数据,如果没有写那就一直在一个while(1)的循环里读,这样当我数据没写进去时候,这边就了。...

空空如也

空空如也

1 2 3 4 5
收藏数 100
精华内容 40
关键字:

while语句死循环的原因