当我使用具有多个条件的 if 语句时,它们在编译器中是如何管理的?
A)如果第一个语句未满足,它会忽略第二个语句吗?反之亦然?
If(time > 3.0 && hitEnabled)
B)经常建议使用后期定义,所以我应该更喜欢在 if 语句中使用一个条件吗?
if(time > 3.0)
if(hitEnabled)
谢谢!
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 语句以避免不必要的检查
在
&&
的情况下,如果第一个条件为假,则永远不会评估第二个条件,并且总体结果为假。对于 ||
,如果第一个条件为真,则不会评估第二个条件,并且总体结果为真。正如 Rob 指出的,这被称为短路评估。
当我们想要仅在第一个操作数返回 true 时才计算
if
语句的第二个操作数时,这非常有用。例如,我们可能想在使用变量之前检查它的有效性。
if(ptr != NULL && *ptr > x)
在这种情况下,仅当
ptr
不是 NULL
时,才会根据 x 进行检查。
A) 如果第一个条件为 false,它不会检查 hitEnabled,如果你想这样做,你必须使用短路 AND (&),如下所示。即使第一个条件为 False,它也会检查第二个条件。
If(time > 3.0 & hitEnabled)
B)这很大程度上取决于您对应用程序的需求,而不是硬件的性能。如果您想在任何情况下检查这两个条件,B 选项 完全没问题,但如果您确定时间 > 3.0 为假并且您不想检查第二个条件,那么我认为A 选项 更可取。正如我之前所说,这很大程度上取决于程序的逻辑,因此您无法根据一行代码得到正确的答案。
如果您只是问没有逻辑背景的更好的写作方式,那取决于您。如果您遵循代码约定,这两种变体都易于阅读。
一旦表达式确定为真或假,表达式的计算就会停止。
这允许像
if (x != null && x.property ...
这样的表达式作为 x.property 在 x 为 null 等情况下不会被计算。
String someString = null;
if (someString != null && someString[4].Equals('a'))
{
//// not called
}
if (someString != null || someString[4].Equals('a'))
{
//// exception
}
Console.ReadLine();
第一种情况:
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)
如果违反第一个条件,它不会检查第二个条件,并且会直接忽略。 如果您想放置任何代码,最好将其嵌套。