C语言解释器-10 控制结构之循环
2013-03-28 16:59
429 查看
循环具有类似的结构:条件判断,循环体。
其基类如下所示:
do...while与while不同的部分在于,先运行循环体,再运行判断:
复杂一点的是for循环,比其它循环结构多出初始化部分和迭代部分:
由于初始化部分可以定义循环变量,形如:for(inti=0;....)。所以,还需要重载以下两个方法:
然后就可以确定for循环的运行代码:
其基类如下所示:
publicclassLoop:ControlFlow { publicExpression.ExpressionNodeCondition; publicvirtualBlockBody { get{returnChildren.Count>0?Children.Last()asBlock:null;} } publicboolNeedBreak=false; publicboolNeedContinue=false;
最简单的循环莫过于while,或do..while。好了,已经将while循环都列举了。先看while循环的运行代码:
publicoverridevoidRun(Contextctx)
{
Debug.WriteLine("BeginWhile.");
base.Run(ctx);
while(true)
{
if(Condition!=null)
{
Expression.Operand.ValuecondVal=Condition.Evaluate(this).GetValue(this);
Debug.WriteLine(string.Format("Condition:[{0}]={1}",Condition.ToString(),condVal.ToString()));
if(condVal.AsInt==0)
{
break;
}
}
Body.Run(this);
if(NeedBreak)
break;
}//while
Debug.WriteLine("EndWhile.");
}
do...while与while不同的部分在于,先运行循环体,再运行判断:
publicoverridevoidRun(Contextctx)
{
Debug.WriteLine("BeginDo...While.");
base.Run(ctx);
while(true)
{
Body.Run(this);
if(NeedBreak)
break;
if(Condition!=null)
{
Expression.Operand.Valueval=Condition.Evaluate(this).GetValue(this);
Debug.WriteLine(string.Format("Condition:{0}={1}",Condition.ToString(),val.ToString()));
if(val.AsInt==0)
{
break;
}
}
}//while
Debug.WriteLine("EndDo...While.");
}
复杂一点的是for循环,比其它循环结构多出初始化部分和迭代部分:
publicclassForLoop:Loop
{
publicContextInitializer
{
get{returnChildren.Count>0?Children.First():null;}
}
publicExpression.ExpressionNodeIterator;
由于初始化部分可以定义循环变量,形如:for(inti=0;....)。所以,还需要重载以下两个方法:
publicoverrideboolHasDefined(stringstr)
{
if(FindByName(str)==null)
returnbase.HasDefined(str);
else
returntrue;
}
publicoverrideContextFindByName(stringstr)
{
Contextres=null;
if(Initializer!=null)
{
Initializer.Parent=null;
res=Initializer.FindByName(str);
Initializer.Parent=this;
}
if(res==null)
returnthis.Parent.FindByName(str);
else
returnres;
}
然后就可以确定for循环的运行代码:
publicoverridevoidRun(Contextctx)
{
Debug.WriteLine("BeginFor.");
if(Initializer!=null)
Initializer.Run(this);
base.Run(ctx);
while(true)
{
if(Condition!=null)
{
Expression.Operand.Valueval=Condition.Evaluate(this).GetValue(this);
Debug.WriteLine(string.Format("Condition:[{0}]={1}",Condition.ToString(),val.ToString()));
if(val.AsInt==0)
{
break;
}
}
Body.Run(this);
if(NeedBreak)
break;
if(Iterator!=null)
Iterator.Evaluate(this);
}//while
if(Initializer!=null)
{
Initializer.FreeLocalVariables();
}
Debug.WriteLine("EndFor.");
}
相关文章推荐
- 循环控制结构程序02 - 零基础入门学习C语言17
- 循环控制结构程序03 - 零基础入门学习C语言18
- C语言初步-第31讲:循环控制结构及流程图(次数不定的循环的流程图)
- IOS开发---C语言-⑤流程控制:顺序结构、选择结构、循环结构
- 《C语言及程序设计》实践项目——循环控制结构流程图
- 循环控制结构程序02 - 零基础入门学习C语言17
- C语言学习10(循环结构:do-while语句)
- 循环控制结构程序03 - 零基础入门学习C语言18
- 循环控制结构程序04 - 零基础入门学习C语言19
- 黑马程序员------C语言-----流程控制(循环结构:while,for)
- C语言初步-第31讲:循环控制结构及流程图(循环的嵌套流程图)
- C语言学习十一流程控制的学习之循环结构学习
- 循环控制结构程序04 - 零基础入门学习C语言19
- 循环控制结构程序05 - 零基础入门学习C语言20
- C语言解释器-9 控制结构之if
- 循环控制结构程序05 - 零基础入门学习C语言20
- 循环控制结构程序06 - 零基础入门学习C语言21
- 10. 程序流控制-循环结构 【连载 10】
- 循环控制结构程序07 - 零基础入门学习C语言22
- C语言解释器-11 控制结构之switch