for循环条件在for循环中可以使用break==和!=吗?

关于for循环中i=0与i=arr.length容易被忽视的bug - 推酷
关于for循环中i=0与i=arr.length容易被忽视的bug
for循环中的这两种写法
for(var i=0,len=arr.i&i++){
上面这种是最为常见也是初学者经常写的
而下面这种写法,在性能上则是比上面的更好,然而我们今天要讨论的并不是这两者性能上的区别,而是第一种写法有时候会带来一些让人毫无头绪的bug。
for(var i=arr.i--;){
今天写一个h5的视频弹幕的时候就遇到了这个bug,先贴代码
function drawScreen() {
setTimeout(function () {
//绘制视频
context.drawImage(videoEle, 0, 0, 960, 720)
//绘制弹幕
for (var i = 0, len = messages. i & i++) {
for (var i = messages. i--;) {
var message = messages[i]
context.fillText(message.value, message.x, message.y)
messages[i].x -= 10
if (messages[i].x &= 0) {
messages.splice(i, 1)
setTimeout(arguments.callee, 30)
drawScreen()
简要解释一下这段代码的意思,我主要想写一个视频弹幕,所以利用canvas替代了原有的视频video标签。
context.drawImage(videoEle, 0, 0, 960, 720)
这里主要是用drawImage把原有视频的画面一张一张的拿出来之后重新绘制在画布上,相当于取代了原有的video标签。
for (var i = 0, len = messages. i & i++) {
var message = messages[i]
context.fillText(message.value, message.x, message.y)
messages[i].x -= 10
if (messages[i].x &= 0) {
messages.splice(i, 1)
这段则是我们将要讨论的代码。messages是一个数组,保存着弹幕的信息,包括弹幕的位置,弹幕的内容都在这里保存着。
我们先用一个for循环把messages的东西都取出来,之后就开始对数组里面保存的每一个弹幕进行绘制在canvas上。
在此处,当某条弹幕的内容超出了屏幕的宽度的时候,我们需要把它从数组中删除掉从而节约资源,这时候问题就出现了。
假设现在我们有三条弹幕的信息,分别简单的设为1,2,3
var messages=[1,2,3]
当第一条弹幕消息超出了屏幕的宽度,这时的for循环中调用这行代码把第一条弹幕消息从数组中删除了
messages[i,1]
所以,此时弹幕数组变成了,注意这里,很重要!!
虽然删除了第一个弹幕消息,但是原来的for还在继续执行,这时的for循环执行到了i=1的情况。
由于原数组变成了
所以messages[1]读取到的就是原来的弹幕3。
messages[1]  //3
到了这一步,获取你已经发现问题了。嗯,我们的for循环还在继续,所以此时的i=2,那么问题就来了messages[2]到底是谁呢?
很明显,messages只有messages[0]和messages[1],所以很抱歉,此时的messages[3]获取到的是undefined,好了,接着看我们原来的代码
for (var i = 0, len = messages. i & i++) {
var message = messages[i]
context.fillText(message.value, message.x, message.y)
messages[i].x -= 10
if (messages[i].x &= 0) {
messages.splice(i, 1)
messages[3]是undefined,所以很明显此处的
context.fillText(message.value, message.x, message.y)
肯定会出错。undefined怎么可能会拿得到value,x,y等值呢?所以浏览器就给我报了个错
Uncaught TypeError: Cannot read property 'value' of undefined
嗯,很好,我们bug的根源已经找到了,那么该怎么修改呢?这就扯到开篇说的var i=len了。所以此处我们bug的改法是这样的
for (var i = messages. i--;) {
var message = messages[i]
context.fillText(message.value, message.x, message.y)
messages[i].x -= 10
if (messages[i].x &= 0) {
messages.splice(i, 1)
请注意,for循环的地方改变了,这样的写法bug就没了,因为我们的i值是从最后一个开始遍历,所以此处当第一条弹幕被删除的时候,弹幕2与弹幕3早就已经遍历完了。
希望这篇博文可以帮助需要的人,谢谢大家的阅读,有不足之处请谅解,望大家指出来共同进步。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致> c语言循环求助下面for循环,在满足if条件并执行一次if{}内语句后,会继续for循环吗?我执行
c语言循环求助下面for循环,在满足if条件并执行一次if{}内语句后,会继续for循环吗?我执行
suyangniha & &
发布时间: & &
浏览:231 & &
回复:1 & &
悬赏:0.0希赛币
c语言 循环求助下面for循环,在满足if条件并执行一次if{}内语句后,会继续for循环吗?我执行的结果并没有循环打印while的。for (i=0;i&44425L;i++)&
fread(sss,1,20,fe);
cprintf(&\r%5ld&,i);
if (strnicmp(str,sss,20)==0||(sss[0]==' '&&strnicmp(str,sss+1,19)==0))
fseek(fc,i*20L,SEEK_SET);
fread(sss,1,20,fc);
cprintf(&\r
%s\n&,sss);
if (getch()==27)
cprintf(&\r
} printf(&while&); }
对于for循环,其就是一个顺序执行,直到{}的结束,至于,你那没有循环打印whilegetch()==27 有个break,break会导致跳出for。lz可以单步调试,vs F9下断点,F10单步调试suyanscut & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&在for循环中可不可以使用break和continue_百度知道
在for循环中可不可以使用break和continue
别情况使用二者都作用?
提问者采纳
break语句能用于循环语句switch语句外任何其语句break语句用结束整循环程再判断执行循环条件否立continue语句用结束本循环终止整循环程序比:for(i=1;i&10;i++)
if(i%3==0)
sum=sum+i;
程序作用:i3倍数则结束本循环既执行sum=sum+i;i再加1整程序作用实现sum=1+2+4+5+7若continue改break则实现功能即:sum=1+2
提问者评价
谢谢!对我有帮助。
其他类似问题
为您推荐:
其他6条回答
break逃循环执行循环执行循环面语句continue停止执行continue面语句跳本循环继续执行循环希望能够帮
可以使用,break是在要跳出程序的地方使用continue是运行到此处返回继续循环
可以使用,break一般是放在选择结构的,作用是跳出当前循环,continue是停止当前循环并返回到循环头
可以break用来跳出循环,不再进行循环操作continue用来结束本次循环,即不执行continue后面的代码,直接进行下次循环
从程序设计语言的角度来说当然是可用的。但是从结构化程序设计及程序设计方法上来说,不推荐这么写。
for循环的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁当前位置:
>>>给出如下For循环语句S=0Fori=1To10S=S+iNext输出S(1)写出以上程序..
给出如下For循环语句S=0For i=1 To 10S=S+iNext输出S(1)写出以上程序语句所执行的算法功能,并求出输出的结果.(2)试用算法框图表示以上程序语句.
题型:解答题难度:偏易来源:不详
(1)算法功能是计算并输出“1+2+3+4+5+6+7+8+9+10”的和.S=55(2) 算法框图略(1)注意看到循环变量是否参与运算,并且还要注意循环体结束时循环变量的值.(2)画程序框图时要注意循环结构选用直到型还是当型,并且要注意正确的画出功能框.
马上分享给同学
据魔方格专家权威分析,试题“给出如下For循环语句S=0Fori=1To10S=S+iNext输出S(1)写出以上程序..”主要考查你对&&输入语句、输出语句和赋值语句,条件语句、循环语句&&等考点的理解。关于这些考点的“档案”如下:
现在没空?点击收藏,以后再看。
因为篇幅有限,只列出部分考点,详细请访问。
输入语句、输出语句和赋值语句条件语句、循环语句
输入语句:
在该程序中的第1行中的INPUT语句就是输入语句。这个语句的一般格式是: 其中,“提示内容”一般是提示用户输入什么样的信息。如每次运行上述程序时,依次输入-5,-4,-3,-2,-1,0,1,2,3,4,5,计算机每次都把新输入的值赋给变量“x”,并按“x”新获得的值执行下面的语句。
输出语句:
在该程序中,第3行和第4行中的PRINT语句是输出语句。它的一般格式是: 同输入语句一样,表达式前也可以有“提示内容”。
赋值语句:
用来表明赋给某一个变量一个具体的确定值的语句。 除了输入语句,在该程序中第2行的赋值语句也可以给变量提供初值。它的一般格式是:赋值语句中的“=”叫做赋值号。 算法语句的作用:
输入语句的作用:输入信息。输出语句的作用:输出信息。赋值语句的作用:先计算出赋值号右边表达式的值,然后把这个值赋给赋值号左边的变量,使该变量的值等于表达式的值。条件语句:
算法中的条件结构由条件语句来表达。
循环语句:
在一些算法中,从否处开始,按照一定条件,反复执行某一处理步骤的情况,这就是循环结构。 反复执行的处理步骤称为循环体。 条件语句的一般格式:
(IF-THEN-ELSE格式) 当计算机执行上述语句时,首先对IF后的条件进行判断,如果条件符合,就执行THEN后的语句1,否则执行ELSE后的语句2。
循环结构的形式:
左图,先判断后执行,先判断指定的条件是否为真,若条件为真,执行循环条件,条件为假时退出循环。 右图,先执行后判断,先执行循环体,然后再检查条件是否成立,如果不成立就重复执行循环体,直到条件成立退出循环。
发现相似题
与“给出如下For循环语句S=0Fori=1To10S=S+iNext输出S(1)写出以上程序..”考查相似的试题有:
815969831083864186883357799190840050}

我要回帖

更多关于 在for循环中可以使用break 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信