在检查我的Windows移动设备上是否有摄像头并启用时,我遇到了一些我不理解的东西.
代码如下所示:
public static bool CameraP(){
return Microsoft.WindowsMobile.Status.SystemState.CameraPresent;
}
public static bool CameraE()
{
return Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
}
public static bool CameraPresent1()
{
return Microsoft.WindowsMobile.Status.SystemState.CameraPresent
&& Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
}
public static bool CameraPresent2()
{
return CameraP() && CameraE();
}
Run Code Online (Sandbox Code Playgroud)
当我调用CameraPresent2()它时返回false(没有相机存在).但是,当我打电话给CameraPresent1()我收到一个MissingMethodException并注释"找不到方法:get_CameraEnabled Microsoft.WindowsMobile.Status.SystemState."
第二个术语的评估CameraPresent1是因为它们都是属性(在语言层面)吗?
还有什么能解释行为上的差异吗?
我尝试过以下方面:
if(myString != nil && myString.length) { ... }
Run Code Online (Sandbox Code Playgroud)
得到了:
- [NSNull length]:发送到实例的无法识别的选择器
在第一个条件失败后,Objective-C不会短路吗?
很抱歉,这听起来像是一个非常愚蠢的问题.
但我用Google搜索了网络,并专门搜索了php.net网站和stackoverflow.com网站.
我知道PHP在使用and, or, &&, ||运算符时会进行短路延迟评估,但在PHP手册中它的声明清晰明了?
我发现只有维基百科是唯一的'可信'来源,它说PHP对这些运营商进行了懒惰的评估.
为什么不bool?支持解除&&和||?他们本可以提升true和false操作员,这些操作员会间接地增加&&和提升||.
运营商|和&已取消和落实正确的三值逻辑.但当然,他们并没有像||和那样短路&&.
问题是为什么他们在创建规范时决定不提升这些操作符.所以"就像这样,因为规范说的如此"对"为什么?"没有答案.
当抬起true并false让null既不是true也不是false:
public static bool operator true(bool? x)
{
return x.HasValue && x.Value
}
public static bool operator false(bool? x)
{
return x.HasValue && !x.Value
}
Run Code Online (Sandbox Code Playgroud)
这将产生&&和||表现就像他们的非短路对应物.不同之处在于false && anything和true || anything将短路(false和true在这两个例子中没有编译时间常数).
这与 …
前几天我错过了我的课堂讲座,我想知道是否有人可以解释短路是什么,也许是一个简单的Java程序中使用它的例子.谢谢你的帮助!
在Java 8上读了一下,我得到了这篇博文,解释了一些关于流和减少它们的内容,以及什么时候可以缩短缩减.在底部它表明:
注意在
findFirst或者findAny我们只需要与谓词匹配的第一个值(虽然findAny不能保证返回第一个).但是如果流没有排序,那么我们期望findFirst表现得像findAny.的操作allMatch,noneMatch并anyMatch可能不短路流,因为在所有可能需要评估所有的值,以确定操作者是否是true或false.因此,使用这些的无限流可能不会终止.
我得到了这个findFirst或者findAny可能会缩短减少量,因为一旦你找到了一个元素,你就不需要再进一步处理了.
但为什么这不可能allMatch,noneMatch并且anyMatch?因为allMatch,如果找到与谓词不匹配的一个,则可以停止处理.同样没有.而且anyMatch尤其是没有道理给我,因为它几乎等于findAny(除了返回什么)?
说这三个可能不会短路,因为它可能需要评估所有的值,也可以说findFirst/Any.
我缺少一些根本区别吗?我真的不明白发生了什么事吗?
我认为Java有短路评估,但这一行仍然抛出一个空指针异常:
if( (perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey())) ) {
Run Code Online (Sandbox Code Playgroud)
在这种情况下perfectAgent是null,所以我只是希望整个表达式返回false,但我的应用程序与一个NullPointerException这条线仍然会崩溃.
编辑,一般回复:
由于perfectAgentIS null,没什么的权&&应该被执行,因为这是不可能的表达是真实的.更重要的是,它不可能执行,perfectAgent.getAddress()因为perfectAgent它不包含有效的引用(它是null和all).我正在尝试使用短路评估,而不必在单独的语句中检查null,因为这会使逻辑变得更加草率.
编辑2(或者,我是一个白痴):是的,就像生活中的许多事情一样,在向世人宣布你是个白痴之后,你就找到了答案.在这种情况下,我在执行其他操作时关闭了Eclipse的autobuild而没有将其重新打开,因此我调试了与我的源不匹配的类文件.
我想咨询SQL Server OR短路
码:
DECLARE @tempTable table
(
id int
)
INSERT @tempTable(id) values(1)
DECLARE @id varchar(10)
SET @id = 'x'
SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int
Run Code Online (Sandbox Code Playgroud)
为什么?1 = 1且@ id ='x'为真.
SQL Server OR运算符:是否有短路功能?
谢谢
来自维基百科:
懒惰的评价是:
在编程语言理论中,延迟评估或按需调用是一种评估策略,它延迟表达式的评估,直到需要它的值
短路评估是:
短路评价,最小评估,或麦卡锡评价表示在将第二个参数时,才执行或评价一些编程语言一些布尔运算符的语义如果第一参数不足以确定表达式的值
那么它们之间有什么区别,例如当我有:
if(false && true && true) {
//boo
}
Run Code Online (Sandbox Code Playgroud)
据我所知,编译器之后不会执行表达式,false因为我已经完成&&了整个表达式false.(对?)
这种行为称为懒惰评估还是短路评估?
VBA不会短路
VBA不支持短路 - 显然是因为它只有按位和/或/不等操作.从VBA语言规范:"逻辑运算符是对其操作数执行按位计算的简单数据运算符." 从这个角度来看,使用true = &H1111和设计VBA是有道理的false = &H0000:这样,逻辑语句可以被评估为按位运算.
缺少短路可能会导致问题
性能:在ReallyExpensiveFunction()评估此语句时将始终运行,即使条件左侧的结果不需要
If IsNecessary() And ReallyExpensiveFunction() Then
'...
End If
错误:如果MyObj为Nothing,则此条件语句将导致运行时错误,因为VBA仍将尝试检查值 Property
If Not MyObj Is Nothing And MyObj.Property = 5 Then
'...
End If
我用来实现短效行为的解决方案是嵌套If的
If cond1 And cond2 Then
'...
End If
Run Code Online (Sandbox Code Playgroud)
变
If cond1 Then
If cond2 Then
'...
End If
End If
Run Code Online (Sandbox Code Playgroud)
通过这种方式,If语句给出了类似短路的行为,即不打算评估cond2是否cond1存在False.
如果存在Else子句,则会创建重复的代码块
If Not MyObj Is Nothing And MyObj.Property …Run Code Online (Sandbox Code Playgroud) short-circuiting ×10
java ×3
c# ×2
algorithm ×1
java-8 ×1
java-stream ×1
objective-c ×1
php ×1
short ×1
sql-server ×1
t-sql ×1
terminology ×1
vba ×1