精华内容
下载资源
问答
  • 多条件组合有三种方式,一种为多个 if 嵌套,第二种为 And(或 *)组合多个条件,第三种为 Or(或 +)组合多个条件 And(或 *)组合条件是“与”的关系, Or(或 +)组合条件是“或”的关系,它们的写法比 ...

     if函数是 Excel 中的条件判断函数,它由条件与两个返回结果组成,当条件成立时,返回真,否则返回假。if函数中的条件既可以单条件,也可以是多条件;多条件组合有三种方式,一种为多个 if 嵌套,第二种为用 And(或 *)组合多个条件,第三种为用 Or(或 +)组合多个条件。用 And(或 *)组合条件是“与”的关系,用 Or(或 +)组合条件是“或”的关系,它们的写法比 if 嵌套简单。以下就是它们的具体操作方法,实例中操作所用版本均为 Excel 2016。

    一,基本用法。

    if函数有三个参数,即=if(条件,满足条件返回的值,不满足条件返回的值)。

    如下图所示,如果工资大于5000,就显示交税,否则显示不交税。我们在G2单元格中输入函数=IF(F2>5000,"纳税","不纳税")。条件是F2>5000,满足条件时返回纳税,不满足条件是返回不纳税。填写完成后在G2单元格右下角双击+号或者向下拖动完成填充。

    此处第二个参数和第三个参数是文本格式,需要加上英文状态下的双引号。每个参数之间的逗号也要是英文状态下的逗号。

    输入=if的时候看到下面有if函数的提示,通过上下方向键选好函数后,按键盘左边的tab键可以快速把函数选择到编辑区。

     

     

    再比如如果工资小于6000,那么在原来工资上加200,否则工资不变。

    如下图,在G2单元格中输入函数=IF(F2<6000,F2+200,F2)即可。表示满足条件单元格F2<6000,那么返回F2+200,如果不满足条件,返回F2。向下填充即可计算所有单元格的结果。

     

    二、if函数嵌套。

    如果判断工资大于7000,那么工资加500,工资大于5000小于等于7000,那么工资加300,工资小于等于5000,工资加100。该如何写函数呢?

    这个函数就需要两个if函数嵌套来完成。在F2单元格中输入函数公式=IF(E2>7000,E2+500,IF(E2>5000,E2+300,E2+100))。

    这个函数表示如果满足条件E2>7000,返回E2+500,不满足就进行下一个if函数运算。在IF(E2>5000,E2+300,E2+100)中,因为刚才第一层if函数已经对if函数做出了大于7000的判断,所以此处的判断是以小于等于7000为前提的。表示大于5000,小于等于7000时,返回E2+300,如果不满足大于等于5000时(更不可能大于7000了),返回E2+100。

    当然,if函数可以进行更多层的嵌套,可以嵌套9层。

     

    三、if函数与and函数结合。

    如果要把所有女硕士的工资加500显示在F列中,不调整工资的F列不显示,函数公式该如何写呢?

    此处的函数公式=IF(AND(C2="女",D2="硕士"),E2+500,"")。此处if函数仍然是基本的三个参数,第一个参数AND(C2="女",D2="硕士")表示判断条件,同时满足C2单元格的内容为女,D2单元格的内容为硕士时条件成立,返回第二个参数E2+500,否则返回空值。英文状态输入两个双引号即表示空值。

     

    四、if函数与or函数结合。

    如果要把所有本科及硕士学历的工资加500,大专学历工资不调整,最后结果都显示在F列中,该如何写函数公式呢?

    此处的函数公式==IF(OR(D2="本科",D2="硕士"),E2+500,E2)。第一个参数OR(D2="本科",D2="硕士")表示满足D2=本科或者硕士其中一个条件就算条件成立。如果条件成立,返回结果E2+500,否则返回E2的值。

     

    这就结束

    转载于:https://www.cnblogs.com/yh-z/p/11193273.html

    展开全文
  • Excel IF函数怎么用

    2018-03-19 16:32:00
    本例主要介绍Excel表格中IF函数的用法,包括基本用法、单条件多条件表达及在数组函数中的用法和在数组函数中怎么表达多条件和单条件。 工具/原料 Excel IF函数语法介绍: 1...

    本例主要介绍Excel表格中IF函数的用法,包括基本用法、单条件、多条件表达及在数组函数中的用法和在数组函数中怎么表达多条件和单条件。

    Excel IF函数怎么用

     

    工具/原料

     
    • Excel

    IF函数语法介绍:

     
    1. 1

      IF函数有三个参数,语法如下:

      =IF(条件判断, 结果为真返回值, 结果为假返回值)

      第一参数是条件判断,比如说“A1="百度"”或“21>37”这种,结果返回TRUE或FALSE。如果判断返回TRUE那么IF函数返回值是第二参数,否则返回第三参数。

      Excel IF函数怎么用
    2. 2

      如上图,

      =IF(1>2,"判断真","判断假")

      其中判断1大于2结果是假也就是FALSE,所以单元格返回第三参数文本“判断假”。

    3. 3

      第一参数在某些情况下不是用比较判断符号来判断的。Excel中将0认为是FALSE,非0值等价于TRUE。所以如下图,B1公式为:

      =IF(SUM(A1:A2),"判断真","判断假")

      因为A1:A2合计大于0,所以返回第二参数文本“判断真”。

      Excel IF函数怎么用
      END

    IF函数参数省略用法简介:

     
    1. 1

      Excel中很多函数部分参数可以省略,IF函数也一样。如下图B1的公式为:

      =IF(1>2,"判断真")

      省略了第三参数,则返回第三参数值时会返回FALSE。这对求满足条件最大值和最小值是由实际意义的,效果与0不同。

      Excel IF函数怎么用
    2. 2

      如果把公式改成:

      =IF(1>2,"判断真",)

      公式中通过第二参数后的逗号给第三参数留了位置,但是没有输入任何值,那么默认是返回0这个数字的。也就是逗号后面不输入参数默认返回值为0。

      Excel IF函数怎么用
    3. 3

      第二参数也是一样的规律,如果公式改成:

      =IF(3>2,,"判断假")

      第二参数位于两个逗号之间,没有输入值,则默认返回0。

      Excel IF函数怎么用
    4. 4

      如果将公式改成:

      =IF(3>2,TRUE,FALSE)

      则单元格会返回TRUE或FALSE这两个逻辑值结果之一。

      Excel IF函数怎么用
      END

    IF普通公式单条件表达:

     
    1. 1

      如下图,B2公式为:

      =IF(A2>29,"不惑","小年轻")

      这是IF函数单条件表达的方式,第一参数只有一个比较。

      Excel IF函数怎么用
    2. 2

      IF单条件表达可以用数轴的方式来理解。整个数轴是全体,判断为TRUE返回结果为数轴的一部分;判断为FALSE返回结果是数轴的其余所有部分,两个部分不会交叉。

      Excel IF函数怎么用
      END

    IF普通公式多条件同时满足表达:

     
    1. 1

      如下图,如果A2大于29且B2是“A”则返回优秀,其余结果返回空。C2公式为:

      =IF(AND(A2>29,B2="A"),"优秀","")

      这里用AND()函数表达了多个判断条件,只有所有判断都返回TRUE才返回“优秀”。

      Excel IF函数怎么用
    2. 2

      大家在使用IF多条件判断的时候一定要考虑全面,不要漏掉可能!以上面的两个条件,且没有嵌套IF的例子说明。

      可以将两个条件用纵横两条线交叉表示,同时满足“大于34,为A”的结果只占所有可能的四分之一,也就是其他所有可能都返回空。如果3个条件你排除的可能更多,如果再嵌套IF继续判断……

      Excel IF函数怎么用
    3. 3

      重点提醒:

      如果有多个条件并且嵌套判断,一定要考虑清楚所有的情况,否则容易出现预期之外的错误返回,很多情况是漏考虑了某些情况!

      END

    IF普通公式多条件满足其一即可表达:

     
    1. 1

      上面讲述了同时满足多个条件,那么满足多条件之一如何表达呢?C2输入公式:

      =IF(OR(A2="A",B2>100),"合格","不合格")

      IF函数中可以用OR()函数来表达满足条件之一,也就是OR()函数内的判断只要有一个返回TRUE,OR()函数整体就返回TRUE。

      Excel IF函数怎么用
    2. 2

      提醒:

      使用多个OR()函数并且还有IF嵌套的情况下更要考虑所有情况,避免遗漏。

      END

    IF数组公式同时满足多条件表达:

     
    1. 1

      如下图,要求A列为“A”且B列大于40的B列数据合计,C2输入公式:

      =SUM(IF((A2:A4="A")*(B2:B4>40),B2:B4))

      左手按住Ctrl+Shift,右手按回车运行公式。

      Excel IF函数怎么用
    2. 2

      这里(A2:A4="A")和(B2:B4>40)的判断分别返回TRUE或FALSE,其中的星号可以理解为“乘号”,在运算时TRUE相当于1,FALSE相当于0,所以只有两个返回值都是TRUE,乘积才是1;只要有一个FALSE,也就是只要有一个不满足条件,返回结果就是0。而IF第一参数中非0值相当于TRUE,所以可以达到同时满足两个条件统计的目的。

      END

    IF数组公式满足多条件表达:

     
    1.  

      如下图,要求A列为“A”或B列大于40的B列数据合计,C2输入公式:

      =SUM(IF((A2:A4="A")+(B2:B4>40),B2:B4))

      左手按住Ctrl+Shift,右手按回车运行公式

      Excel IF函数怎么用
    2. 2

      把同时满足多条件的乘号改成加号就达到了“或者”的目的。因为只要有一个是TRUE,相加结果就是1,如果两个都是TRUE相加结果就是2。所以达到了判断结果相加,只要结果非0就计算B列数据合计的目的。

    转载于:https://www.cnblogs.com/janicemvidal/p/8602967.html

    展开全文
  • 多条件组合有三种方式,一种为多个 if 嵌套,第二种为 And(或 *)组合多个条件,第三种为 Or(或 +)组合多个条件 And(或 *)组合条件是“与”的关系, Or(或 +)组合条件是“或”的关系,它们的写法比 if 嵌套...

    if函数是 Excel 中的条件判断函数,它由条件与两个返回结果组成,当条件成立时,返回真,否则返回假。if函数中的条件既可以单条件,也可以是多条件;多条件组合有三种方式,一种为多个 if 嵌套,第二种为用 And(或 *)组合多个条件,第三种为用 Or(或 +)组合多个条件。用 And(或 *)组合条件是“与”的关系,用 Or(或 +)组合条件是“或”的关系,它们的写法比 if 嵌套简单。以下就是它们的具体操作方法,实例中操作所用版本均为 Excel 2016。

    一、Excel if函数语法

    1、表达式:IF(logical_test,[value_if_true],[value_if_false])

    中文表达式:如果(条件,条件为真时执行的操作,条件为假时执行的操作)

    2、说明:[value_if_true] 和 [value_if_false] 表示可选项,即它们可以不写,如图1所示:图1

    按回车,返回 False,因为 E2 为 435,F2 为 528,E2 > F2 不成立,如图2所示:图2

    另外,=IF(3 > 2,),返回 0,此处 0 表示假。

    二、Excel if函数单条件使用方法

    1、一个服装销量表中,价格为0的表示已下架,否则表示正在出售,假如要把它们分别用“下架”和“出售中”标识出来,操作过程步骤,如图3所示:图3

    2、操作过程步骤说明:选中 H2 单元格,输入公式 =IF(E2<=0,"下架","出售中"),按回车,则返回“出售中”;把鼠标移到 H2 右下角的单元格填充柄上,按住左键并往下拖,则所经过单元格全填充为“出售中”,按 Ctrl + S 保存,则价格为 0 的单元格用“下架”填充,其它单元格用“出售中”填充。

    3、公式说明:公式 =IF(E2<=0,"下架","出售中") 中,E2<=0 为条件,当条件为真时,返回“下架”,否同返回“出售中”。

    三、Excel if函数嵌套多条件使用方法

    1、假如要标出服装销量表中,“大类”为“女装”、“价格”大于等于 80 且“销量”大于 800 的服装,操作过程步骤,如图4所示:

    2、操作过程步骤说明:选中 H2 单元格,把公式 =IF(C2="女装",IF(E2>=80,IF(F2>800,"满足条件","不满足条件"),"不满足条件"),"不满足条件") 复制到 H2,按回车,则返回“不满足条件”;再次选中 H2,把鼠标移到 H2 的单元格填充柄上,按住左键并往下拖,则所经过单元格用“不满足条件”填充,按 Ctrl + S 保存,同样 H3 用“满足条件”填充,其它单元格仍用“不满足条件”填充。

    3、公式说明:

    =IF(C2="女装",IF(E2>=80,IF(F2>800,"满足条件","不满足条件"),"不满足条件"),"不满足条件")

    由三个 if 组成,即在一个 if 中嵌套了两个 if。第一个 if 的条件为 C2="女装",如果条件为真,则执行 IF(E2>=80,IF(F2>800,"满足条件","不满足条件"),"不满足条件");否则返回“不满足条件”。第二个 if 的条件为 E2>=80,如果条件为真,则执行 IF(F2>800,"满足条件","不满足条件"),否则返回“不满足条件”。第三个 if 的条件为 F2>800,如果条件为真,返回“满足条件”,否则返回“不满足条件”。

    提示:if 最多只能嵌套 64 个 if,尽管如此,在写公式过程中,尽量少嵌套 if;一方面便于阅读与修改,另一方面执行效率也高一些。

    四、Excel if函数用 And 与 OR 组合多个条件使用方法

    (一)用 And 组合多个条件,为“与”的关系

    1、把上例中的多 if 嵌套公式 =IF(C2="女装",IF(E2>=80,IF(F2>800,"满足条件","不满足条件"),"不满足条件"),"不满足条件") 改为用 And 组合,操作过程步骤,如图5所示:图5

    2、操作过程步骤说明:选中 H2 单元格,把公式 =IF(AND(C2="女装",E2>=80,F2>800),"满足条件","不满足条件") 复制到 H2,按回车,则返回“不满足条件”;同样往下拖并保存,返回跟上例一样的结果,说明公式正确。

    3、公式说明:

    =IF(AND(C2="女装",E2>=80,F2>800),"满足条件","不满足条件")

    公式用 And 函数组合了三个条件,分别为 C2="女装",E2>=80,F2>800,当同时满足三个条件时(即 AND(C2="女装",E2>=80,F2>800) 返回“真”),返回“满足条件”,否则返回“不满足条件”。

    4、用 * 代替 And

    A、把公式  =IF(AND(C2="女装",E2>=80,F2>800),"满足条件","不满足条件")

    用 * 代替 And 后变为:

    =IF((C2="女装")*(E2>=80)*(F2>800),"满足条件","不满足条件")

    如图6所示:图6

    B、按回车,返回“不满足条件”,往下拖保存后,也是返回一样的结果。

    (二)用 Or 组合多个条件,为“或”的关系

    1、把上例中的 And 组合多个条件公式 =IF(AND(C2="女装",E2>=80,F2>800),"满足条件","不满足条件") 改为用 Or 组合,操作过程步骤,如图7所示:图7

    2、操作过程步骤说明:选中 H2 单元格,把公式 =IF(OR(C2="女装",E2>=80,F2>800),"满足条件","不满足条件") 复制到 H2,按回车,则返回“满足条件”;同样往下拖并保存,全部返回“满足条件”。

    3、公式说明:

    =IF(OR(C2="女装",E2>=80,F2>800),"满足条件","不满足条件")

    公式用 Or 函数组合了三个条件,分别为 C2="女装",E2>=80,F2>800,即 OR(C2="女装",E2>=80,F2>800),意思是:只要满足一个条件,就返回“真”;一条件都不满足才返回“假”。演示中,每条记录都满足一个条件,所以全返回“满足条件”。

    4、用 + 代替 Or

    A、把公式

    =IF(OR(C2="女装",E2>=80,F2>800),"满足条件","不满足条件")

    用 + 代替 Or 后变为:

    =IF((C2="女装")+(E2>=80)+(F2>800),"满足条件","不满足条件")

    如图8所示:图8

    B、按回车,返回“满足条件”,往下拖保存后,也是全部返回“满足条件”,说明公式正确。

    展开全文
  • EXCEL函数公式集

    热门讨论 2010-03-16 03:26:38
    IF函数替换法总结 查找的函数(查找末位词组) 怎样从原始数据中自动获取最后一数据 两列数据查找相同值对应的位置 查找数据公式两(基本查找函数为VLOOKUP,MATCH) 【输入数据的技巧】 谈谈Excel输入的技巧 一列...
  • 你必须知道的495C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明...
  • 打造一自己的模板引擎(二)

    千次阅读 2013-03-05 13:53:07
    上一篇我们使用递归实现了一模板渲染器,在模板结构复杂,嵌套比较的时候,递归很容易把jvm的栈搞的很大,甚至崩溃。 因此接下来我们想办法避免...执行到if的时候,发现条件语句,并且还有个函数, 那么先把
    上一篇我们使用递归实现了一个模板渲染器,在模板结构复杂,嵌套比较多的时候,递归很容易把jvm的栈搞的很大,甚至崩溃。
    因此接下来我们想办法避免使用递归。


    静态语言在执行的时候,比如:if(my.say() == 'hello'){out.print("hello")}
    用xml来表示:
    <c:if test="${my.say() == 'hello'}">hello</c:if>
    静态语言怎么执行呢?执行到if的时候,发现条件是个语句,并且还有个函数, 那么先把函数代码调入内存,如果有参数,把参数压入栈, 把程序指针指向该函数,
    然后执行,执行完之后把结果压入栈,返回调用处,调用的地方从栈顶取出结果,然后继续执行。


    我们可以考虑用类似的方式, 当遇到一个节点的时候,先调用doStartTag, 然后根据返回值决定是否要执行子节点,如果需要执行子节点,那么就把子节点压入栈,然后返回即可.
    子节点执行完之后,需要调用doEndTag, 因此再把子节点压入栈之前先把当前节点压入栈,调用完doEndTag之后如果需要重复执行子节点,那么就再把自己压入栈,然后把子节点压入栈。
    这样就可以不使用递归了,把递归处理变成了循环处理。而且很容易控制整个循环是否结束. 因为jstl的标签里面有个SKIP_PAGE的功能,也就是某个标签返回SKIP_PAGE的时候,需要立即终止整个渲染。


    现在来说另外一个问题,先举一个例子:
    <c:out escapeXml="true"><div><c:out value="123"></c:out></div></c:out>
    对于这个,它的输出结果是什么呢?正确的输出结果是这样的:
    &lt;div&gt;123&lt;/div&gt;
    标签是怎么执行的呢?
    首先第一层,第一个c:out没有var属性,也没有value属性,也没有defaultValue属性, 也就是说他要输出的是节点内的东西。
    可以反编译一下tomcat或者resin的c:out的实现,发现他实现了BodyTagSupport. 再看一下源码,它还用了BodyContent.
    BodyContent其实就是当前标签的内容,注意是渲染之后的内容。

    也就是说当一个tag实现了BodyTag的时候,它就可以取得它的子标签渲染后的内容。这个功能的实现一开始不太好理解,其实很简单,看一下下面的代码:

    class PageContext{
        JspWriter out;
    
        public JspWriter pushBody()
        {
            this.out = new BodyContent(this.out);
            return this.out;
        }
    
        public JspWriter popBody()
        {
            BodyContent bodyContent = (BodyContent)(this.out);
            this.out = (JspWriter)(bodyContent.getOut());
            return this.out;
        }
    }

    当子标签开始渲染的时候,先pushBody, 把当前的out替换掉,子标签渲染的时候就输出到了新的BodyContent里面, BodyContent其实也是JspWriter, 只不过他有个buffer, 
    所有渲染的结果都输出到了buffer里面:

    public class BodyContent extends JspWriter{
        private StringWriter buffer;
    
        @Override
        public void write(char[] cbuf, int off, int len) throws IOException{
            this.buffer.write(cbuf, off, len);
        }
    
        public String getString(){return this.buffer.toString()}
    }

    当子标签渲染结束的时候,父标签就可以取到BodyContent中的内容了,调用getString返回的就是渲染之后的结果。
    搞清楚这个问题之后,还有一个问题,tag的执行流程,正常情况下,tag是这样执行的:
    doStartTag -> doInitBody -> setBodyContent -> doAfterBody -> doEndTag
    其中doInitBody只有在实现了BodyTag的时候才会有这个方法,
    doAfterBody是在实现了IterationTag之后才会有。
    现在用代码来描述一下tag的大致执行流程:

    int flag = tag.doStartTag();
    
    if(flag == SKIP_PAGE) break;
    
    if(flag != Tag.SKIP_BODY)
    {
        if(tag instanceof BodyTag)
        {
            pageContext.pushBody();
        }
    
        do{
            flag = tag.doAfterBody();
            if(flag != BodyTag.EVAL_BODY_AGAIN)
                break;
        }while (true);
    
        if(tag instanceof BodyTag)
        {
            pageContext.popBody();
        }
    }
    
    flag = tag.doEndTag();
    
    if(flag == SKIP_PAGE) break;

    下面是完整的代码实现:

    public static void evaluate(final Node element, final PageContext pageContext)
    {
        Node node;
        TagEntry tagEntry;
        JspWriter out;
        JspWriter jspWriter = pageContext.getOut();
        Stack<TagEntry> stack = new Stack<TagEntry>();
        stack.push(new TagEntry(element, 0));
        ExpressionContext expressionContext = pageContext.getExpressionContext();
    
        while((tagEntry = stack.poll()) != null)
        {
            out = pageContext.getOut();
            node = tagEntry.getNode();
    
            try
            {
                if(node.getNodeType() == NodeType.TEXT)
                {
                    out.write(node.toString());
                    continue;
                }
    
                if(node.getNodeType() == NodeType.COMMENT)
                {
                    out.write(node.toString());
                    continue;
                }
    
                if(node.getNodeType() == NodeType.EXPRESSION)
                {
                    Object value = expressionContext.evaluate(node.toString());
    
                    if(value != null)
                    {
                        out.write(value.toString());
                    }
    
                    continue;
                }
    
                if(tagEntry.getStatus() == 0 || tagEntry.getStatus() == 2)
                {
                    int flag = startTag(stack, tagEntry, pageContext, expressionContext);
    
                    if(flag == Tag.SKIP_PAGE)
                    {
                        break;
                    }
                }
                else
                {
                    int flag = endTag(stack, tagEntry, pageContext);
    
                    if(flag == Tag.SKIP_PAGE)
                    {
                        break;
                    }
                }
            }
            catch(Exception e)
            {
                throw new RuntimeException(toString("Exception at ", node), e);
            }
        }
    
        pageContext.setOut(jspWriter);
    }
    
    /**
     * @param stack
     * @param tagEntry
     * @param pageContext
     */
    private static int startTag(Stack<TagEntry> stack, TagEntry tagEntry, PageContext pageContext, ExpressionContext expressionContext)
    {
        int flag = 0;
        Tag tag = tagEntry.getTag();
        Node node = tagEntry.getNode();
    
        if(tag == null)
        {
            tag = TagFactory.create(pageContext, node.getNodeName());
            tagEntry.setTag(tag);
            tag.setPageContext(pageContext);
    
            if(tagEntry.getParent() != null)
            {
                tag.setParent(tagEntry.getParent().getTag());
            }
        }
    
        int status = tagEntry.getStatus();
    
        if(status == 0)
        {
            // create - doStartTag
            TagUtil.setAttributes(tag, node.getAttributes(), expressionContext);
            flag = tag.doStartTag();
            tagEntry.setStartTagResult(flag);
        }
        else if(status == 1 || status == 2)
        {
            // to doEndTag
            flag = tagEntry.getStartTagResult();
        }
        else
        {
            // illegal
            throw new IllegalStateException("Tag State Error !");
        }
    
        tagEntry.setStatus(1);
        stack.push(tagEntry);
    
        if(flag == Tag.SKIP_PAGE)
        {
            return Tag.SKIP_PAGE;
        }
    
        if(flag != Tag.SKIP_BODY)
        {
            if(flag != Tag.EVAL_BODY_INCLUDE)
            {
                if(tag instanceof BodyTag)
                {
                    BodyTag bodyTag = (BodyTag)tag;
                    BodyContent bodyContent = (BodyContent)(pageContext.pushBody());
                    bodyTag.setBodyContent(bodyContent);
                    bodyTag.doInitBody();
                }
            }
    
            List<Node> childNodes = node.getChildNodes();
            List<TagEntry> childEntrys = tagEntry.getChildNodes();
            if(childNodes.size() > 0 && childEntrys.size() < 1)
            {
                for(int i = 0, size = childNodes.size(); i < size; i++)
                {
                    TagEntry childTagEntry = new TagEntry(childNodes.get(i), 0);
                    childTagEntry.setParent(tagEntry);
                    childEntrys.add(childTagEntry);
                }
            }
    
            if(childEntrys.size() > 0)
            {
                for(int i = childEntrys.size() - 1; i > -1; i--)
                {
                    TagEntry childEntry = childEntrys.get(i);
                    childEntry.setStatus(0);
                    stack.push(childEntry);
                }
            }
        }
    
        return flag;
    }
    
    /**
     * @param stack
     * @param tagEntry
     * @param pageContext
     */
    private static int endTag(Stack<TagEntry> stack, TagEntry tagEntry, PageContext pageContext)
    {
        Tag tag = tagEntry.getTag();
        IterationTag iterationTag = null;
    
        if(tag instanceof IterationTag)
        {
            iterationTag = (IterationTag)tag;
        }
    
        if(iterationTag != null)
        {
            int flag = iterationTag.doAfterBody();
    
            if(flag == BodyTag.EVAL_BODY_AGAIN)
            {
                tagEntry.setStatus(2);
                stack.push(tagEntry);
                return flag;
            }
            else
            {
                int startTagResult = tagEntry.getStartTagResult();
    
                if(startTagResult != Tag.SKIP_BODY)
                {
                    if(startTagResult != Tag.EVAL_BODY_INCLUDE)
                    {
                        if(tag instanceof BodyTag)
                        {
                            pageContext.popBody();
                        }
                    }
                }
            }
        }
    
        tag.release();
        return tag.doEndTag();
    }

    现在我们的模板引擎已经支持完整的jstl的tag功能了,而且我们避免了使用递归来渲染模板,性能还不错。
    不过目前的实现仍然有不好的地方,编译有点慢,虽然我们可以使用缓存的机制确保它编译一次多次运行,在编译大文件的时候编译速度还是不太满意
    而且程序结构有点复杂。
    下一篇我们将重新设计一种类汇编的执行方式,编译速度将会有很大的提高,执行速度也将得到提升,同时代码结构也变得简单易读。

    展开全文
  • 然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗?  2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确...
  • 内部了一<code>remove函数,这里先不做解析,只要知道他就是移除事件的函数就可以,当移除事件的时候,再执行了传进来的回调函数。进而实现只调用一次的效果。 <p><strong>那么事件代理...
  • 《你必须知道的495C语言问题》

    热门讨论 2010-03-20 16:41:18
    然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 23  2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确...
  • 然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 23  2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确...
  • 然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确说明...
  • 予我耐心解答的老师和同学,是他们为我小程序的成功起到了关键性的作用,那么多个日夜,如此多的困难,同学们勤恳塌实,从开始到结束,没有显出一点倦意,始终热情高涨,我感谢这种氛围,感谢学校提供的良好条件。...
  • 64*128的图片,hog特征+svm可以成功检测出行人。但是换成64*64尺寸的图片,可以训练出svm模型,但是检测时会出错,觉得应该是detector的问题,但是不知道该怎么重写? 对提取好的HogFeatureMat进行pca降维后...
  • 然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 52 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确...
  • 然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 52 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确...
  • 附加条件:给了一200M的文件(数据,可以以txt,csv等形式打开 ) 拿到题目以后解读数据就费了好长时间,数据中的名称全是英文,看了好半天才明白是怎么一回事想到定义数组发现定不了那么大,从网上学了malloc...
  • 然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确说明不...
  • 然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗?  2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明...
  • 分支和循环结构

    2020-07-23 17:41:32
    Day 4 - if语句和循环 if语句 什么时候使用if语句:如果某一段代码需要在满足条件的时候才执行就用if语句 怎么使用if语句 if单分支结构:满足条件...代码块 - 和if保持一缩进的一条或者条语句;需要满足条件
  • 然后又使用一些内存分配技巧使namestr数组起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明不...
  • day04-python分支和循环

    2020-07-23 20:38:44
    if语句 1.1 什么时候使用if语句 如果某一段代码需要在满足条件的时候才执行就是用if语句 1.2 怎么使用if语句 1. 2.1 if单分支结构 — 满足条件执行某个操作,不...代码块 - 和if保持一缩进的一条或者条语句;需
  • javacript之switch

    2014-02-26 11:07:07
    在写JAVASCRIPT时,常会遇到多个条件判断,用IF来实现有点烦,左一个IF右一个IF的,写都写累了,所以就会用到switch,那么在JAVASCRIPT里的switch怎么用呢,其他也不要多说什么,举个例子给大家,大家就能看明白了。...
  • 你必须知道的495C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    来好像有多个元素。这样合法和可移植吗? . . . . . . . . . . . . 8 2.7 是否有自动比较结构的方法? . . . . . . . . . . . . . . . . . . . . 8 2.8 如何向接受结构参数的函数传入常数值? . . . . . . . . . . ....
  • day3-分支与循环

    2020-07-24 23:29:09
    分支与循环 1.if循环 1.1什么时候用if语句 如果某一段代码需要在满足条件的时候才执行就使用if语句 1.2.怎么使用if语句 1.3 if单分支结构 - 满足条件执行...4. 代码块 - 和if保存一缩进的一条或者条语句;需要在
  • 我要申明一点,操作系统就2000,如果说要学习一网络语言还不肯装一操作系统的话,那我看也不要学习了。 先到网上下载一MDAC(要是2.7以上的版本才行),然后安装,安装以后或许会重新启动一次。 然后再...
  • 封装了 100 多个有用的方法,耦合度低,非常适合逐个方法阅读,适合楼主这样的 JavaScript 初学者。从中,你不仅可以学到 void 0 代替 undefined 避免 undefined 被重写等一些小技巧 &#...
  • 小白重新学C语言。 准备把K&R的The C programming language从头到尾学一遍。 然后今天敲到getchar()时,为了做...上面的EAX寄存器应该是存了getchar()的返回值,那后面这值是怎么样被后续操作抹掉的?我不太懂。

空空如也

空空如也

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

if函数多个条件怎么用