嗯,我一直在阅读了很多资源,但他们在definiton不同:术语问题:&&运营商
& &是逻辑 结合的逻辑运算符//我想这是正确的
& &是逻辑运算符AND // I 认为这并不精确从 技术角度看
- & &是 执行条件运算符 逻辑与//我认为这是正确的 以及
虽然在所有的理解而言是正确的,我会说的第一个是最精确的。还是我误会了?
嗯,我一直在阅读了很多资源,但他们在definiton不同:术语问题:&&运营商
& &是逻辑 结合的逻辑运算符//我想这是正确的
& &是逻辑运算符AND // I 认为这并不精确从 技术角度看
虽然在所有的理解而言是正确的,我会说的第一个是最精确的。还是我误会了?
在C#中,Java,C++,C以及其他几种语言,&&
是布尔AND运算符的编程语言实现。它的目的是考虑到以下事实(指不以纯命题逻辑适用):
所以在编程语言中的布尔表达式真有四种可能的结果:true
,false
,“例外”和“无限循环”。在某些情况下,有两个布尔表达式,第二个表达式的可能成功可以通过查看第一个表达式来确定。例如,使用表达式foo != null
和foo.bar == 42
,我们可以确定,如果第一个表达式为假,那么第二个表达式将失败。因此,&&
运算符被设计为“short-cirquited”:如果左操作数计算结果为false,则不计算右操作数。在两个操作数都能成功评估为真或假的所有情况下,这个规则产生的结果与实际上已经评估了两个操作数的结果相同,但它允许提高性能(因为根本不需要评估右操作数)和在不牺牲安全性的情况下增加紧凑性(如果注意表达结构以使左操作数“保护”正确的表达)。同样,如果左操作数的计算结果为true,||
将不会评估右操作数。
更短的答案是,虽然&&
是强烈和启发,它的设计采取一定的编程特点考虑在内,并a && b
或许应该宁可被表述为“返回false,如果a
是假的表达,和值b
如果a
为真“。
简单的答案。
它对2个逻辑表达式执行AND操作,以返回布尔值。如果第一个是错误的,它不会评估第二个。
要评估两者,无论使用&。
复杂的答案。
http://www.ecma-international.org/publications/standards/Ecma-334.htm标题12.3.3.23似乎最相关。
我发现自己不合格批评内的定义。
12.3.3.23 & &表达式
expr的形式
expr-first && expr-second
的表达式:•
expr-first
之前的v的明确赋值状态是相同的expr之前的v的明确赋值状态。•如果
exprfirst
之后的v的状态是明确赋值的或“在真正表达式之后明确赋值”,则明确指定在expr-second
之前的v的明确赋值状态。否则,它不会被无限期地分配。•位于expr之后的v的明确赋值状态取决于:
o如果诉
expr-first
后的状态是明确分配,则v在expr之后的状态是明确分配。ο否则,如果expr-second
之后的v的状态被明确赋值,并且expr-first
之后的v的状态为“在错误表达式之后明确赋值”,则明确指定expr之后的v的状态。 ο否则,如果expr-second
之后的v的状态是明确赋值或“在真表达式后明确赋值”,则expr之后的v的状态为“在真表达式之后明确赋值”。 ο否则,如果expr-first之后的v的状态是“在错误表达式之后明确赋值”,并且expr-second之后的v的状态是“在错误表达式之后明确赋值”,则表示expr之后的v的状态是“在错误表达后明确分配的”。o否则,expr之后的v的状态不是明确分配的。
[实施例:在下面的代码
class A
{
static void F(int x, int y) {
int i;
if (x >= 0 && (i = y) >= 0) {
// i definitely assigned
}
else {
// i not definitely assigned
}
// i not definitely assigned
}
}
可变
i
在的if语句,但不是在其他嵌入式语句之一认为是明确赋值。在方法F的if
语句中,变量i
在第一个嵌入语句中明确分配,因为表达式(i = y
)的执行总是在执行此嵌入语句之前执行。相比之下,变量i在第二个嵌入语句中没有明确赋值,因为x >= 0
可能测试了错误,导致变量i
未被分配。最后一个例子]
我希望能清理一些东西。
我也看到了“短路AND”,对于那些'&&'如果左边是假的,它不会评估它的右边的语言。 – sarnold 2011-04-15 09:08:45