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

问题描述 投票:0回答:7

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

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

If(time > 3.0 && hitEnabled)

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

if(time > 3.0)
    if(hitEnabled)

谢谢!

c# c++
7个回答
3
投票
if(time > 3.0 && hitEnabled)

在上面的语句中,当

hitEnabled
为假时,
time > 3.0
将不会被评估。

这称为短路。

即使

hitEnabled
为 false,以下语句也会计算
time > 3.0
,但当两个操作数均为
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 语句以避免不必要的检查


2
投票

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

当我们想要仅在第一个操作数返回 true 时才计算

if
语句的第二个操作数时,这非常有用。例如,我们可能想在使用变量之前检查它的有效性。

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

在这种情况下,仅当

ptr
不是
NULL
时,才会根据 x 进行检查。


1
投票

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

If(time > 3.0 & hitEnabled)

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

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


0
投票

一旦表达式确定为真或假,表达式的计算就会停止。

这允许像

if (x != null && x.property ...
这样的表达式作为 x.property 在 x 为 null 等情况下不会被计算。


0
投票
        String someString = null;

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

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

        Console.ReadLine();

0
投票

第一种情况:

If(time > 3.0 && hitEnabled)

如果

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

如果您想确保检查所有条件,您应该使用

||
(逻辑
OR
)而不是
&&
(逻辑
AND
),例如:

If(time > 3.0 || hitEnabled)

这个:

if(time > 3.0 && hitEnabled)

等于

if(time > 3.0)
if(hitEnabled)

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.