0

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

A) 如果第一个语句没有得到满足,它会忽略第二个语句吗?反之亦然?

If(time > 3.0 && hitEnabled)

B)通常建议使用后期定义,所以我应该更喜欢在 if 语句中使用一个条件吗?

if(time > 3.0)
    if(hitEnabled)

谢谢!

4

7 回答 7

3
if(time > 3.0 && hitEnabled)

在上面的语句中,当为假hitEnabled时将不会被评估。time > 3.0

这称为短路。

以下语句将hitEnabledtime > 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 语句以避免不必要的检查

于 2013-10-14T09:42:51.037 回答
2

如果&&第一个条件为假,则永远不会评估第二个条件并且总体结果为假。在 的情况下||,如果第一个条件为真,则不评估第二个条件并且总体结果为真。正如 Rob 所指出的,它被称为短路评估。

这在我们想要if仅在第一个操作数返回 true 时才评估语句的第二个操作数的情况下很有用。例如,我们可能想在使用变量之前检查它的有效性。

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

在这种情况下,ptr只有当它不是时,才会根据 x 检查值NULL

于 2013-10-14T09:27:27.083 回答
1

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

If(time > 3.0 & hitEnabled)

B)这在很大程度上取决于您希望从应用程序中得到什么,而不是硬件性能。如果您想在任何情况下检查这两个条件,B 选项非常好,但如果您确定 time > 3.0 是否为假并且您不想检查第二个条件,我认为A 选项更可取。正如我之前所说,它在很大程度上取决于您程序的逻辑,因此您无法根据一行代码得到正确的答案。

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

于 2013-10-14T09:34:17.113 回答
0

在第一种情况下:

If(time > 3.0 && hitEnabled)

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

如果您想确保检查所有条件,您应该使用||(logical OR) 而不是&&(logical AND) 例如:

If(time > 3.0 || hitEnabled)

这个:

if(time > 3.0 && hitEnabled)

等于

if(time > 3.0)
if(hitEnabled)
于 2013-10-14T09:38:04.703 回答
0

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

于 2013-10-14T10:44:02.923 回答
0

表达式的求值一旦确定为真或假,就会立即停止。

这允许像if (x != null && x.property ...x.property 这样的表达式在 x 为 null 等时不会被计算。

于 2013-10-14T09:28:26.480 回答
0
        String someString = null;

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

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

        Console.ReadLine();
于 2013-10-14T09:30:33.050 回答