If语句或拆分中的多个条件

时间:2013-10-14 09:25:41

标签: c# c++ compiler-construction

当我使用具有多个条件的if语句时,它们是如何在编译器中管理的?

A)是否会忽略第二个声明,如果第一个声明未满足,反之亦然?

If(time > 3.0 && hitEnabled)

B)通常建议使用延迟定义,所以我应该优先在if语句中使用一个条件吗?

if(time > 3.0)
    if(hitEnabled)

谢谢!

7 个答案:

答案 0 :(得分:3)

if(time > 3.0 && hitEnabled)

hitEnabled为假时,将不会评估上述语句time > 3.0

这称为短路。

以下语句将评估hitEnabled即使time > 3.0为false,但当两个操作数均为true时返回true。

if(time > 3.0 & hitEnabled)//note bitwise &

if(time > 3.0)
    if(hitEnabled)

当您需要多次检查第一个条件等时,嵌套的if语句很有用。

if(time > 3.0 && hitEnabled)
{
//DoSomething1
}
if(time > 3.0 && flag)
{
//DoSomething2
}

这可以用嵌套的if语句重写,如下所示

if(time > 3.0)
{
    if(hitEnabled)
    {
    //DoSomething1
    }
    if(flag)
    {
    //DoSomething2
    }
}

在这种情况下,我更喜欢嵌套的if语句以避免不必要的检查

答案 1 :(得分:2)

如果&&如果第一个条件为假,则永远不会评估第二个条件,并且整体结果为false。如果是||,如果第一个条件为真,则不评估第二个条件,并且整体结果为真。正如Rob指出的那样,它被称为短路评估。

当我们想要仅在第一个操作数返回true时评估if语句的第二个操作数时,这非常有用。例如,我们可能希望在使用之前检查变量的有效性。

if(ptr != NULL && *ptr > x)

在这种情况下,ptr的值只有在不是NULL时才会与x进行核对。

答案 2 :(得分:1)

A)如果第一个条件为假,它不会检查hitEnabled,如果你想这样做,你必须使用短路 AND(&),如下所示。即使第一个条件为False,也会检查第二个条件。

If(time > 3.0 & hitEnabled)

B)这在很大程度上取决于您对应用程序的要求,而不是硬件的性能。如果您想在任何情况下检查这两个条件, B选项完全没问题,但如果您确定是否时间> 3.0是假的,你不想检查第二个,选项在我看来更可取。正如我之前所说,它在很大程度上取决于程序的逻辑,因此您无法根据一行代码得到正确的答案。

如果你问的是没有逻辑背景的更好的写作方式,那取决于你。如果遵循代码约定,这两种变体都易于阅读。

答案 3 :(得分:0)

表达式的评估一旦确定为真或假就会停止。

如果x为null等,则不允许评估像if (x != null && x.property ...这样的表达式作为x.property。

答案 4 :(得分:0)

        String someString = null;

        if (someString != null && someString[4].Equals('a'))
        {
            //// not called
        }

        if (someString != null || someString[4].Equals('a'))
        {
            //// exception
        }

        Console.ReadLine();

答案 5 :(得分:0)

在第一种情况下:

If(time > 3.0 && hitEnabled)

如果time > 3.0为false,则永远不会检查hitEnabled。它始终从左到右开始检查条件。

如果您想确保检查所有条件,则应使用||(逻辑OR)代替&&(逻辑AND),例如:< / p>

If(time > 3.0 || hitEnabled)

这:

if(time > 3.0 && hitEnabled)

等于

if(time > 3.0)
if(hitEnabled)

答案 6 :(得分:0)

如果第一个条件被违反,它将不会检查第二个条件,它只是忽略。 如果你想放任何代码,最好将它嵌套。