2011-04-15 82 views
1

嗯,我一直在阅读了很多资源,但他们在definiton不同:术语问题:&&运营商

  • & &是逻辑 结合的逻辑运算符//我想这是正确的

  • & &是逻辑运算符AND // I 认为这并不精确从 技术角度看

  • & &是 执行条件运算符 逻辑与//我认为这是正确的 以及

虽然在所有的理解而言是正确的,我会说的第一个是最精确的。还是我误会了?

+1

我也看到了“短路AND”,对于那些'&&'如果左边是假的,它不会评估它的右边的语言。 – sarnold 2011-04-15 09:08:45

回答

3

在C#中,Java,C++,C以及其他几种语言,&&是布尔AND运算符的编程语言实现。它的目的是考虑到以下事实(指不以纯命题逻辑适用):

  • 评估一个操作数计算上可能是昂贵的
  • 评估的操作可能会失败,异常
  • 评估一个操作数可能会进入一个无限循环

所以在编程语言中的布尔表达式真有四种可能的结果:truefalse,“例外”和“无限循环”。在某些情况下,有两个布尔表达式,第二个表达式的可能成功可以通过查看第一个表达式来确定。例如,使用表达式foo != nullfoo.bar == 42,我们可以确定,如果第一个表达式为假,那么第二个表达式将失败。因此,&&运算符被设计为“short-cirquited”:如果左操作数计算结果为false,则不计算右操作数。在两个操作数都能成功评估为真或假的所有情况下,这个规则产生的结果与实际上已经评估了两个操作数的结果相同,但它允许提高性能(因为根本不需要评估右操作数)和在不牺牲安全性的情况下增加紧凑性(如果注意表达结构以使左操作数“保护”正确的表达)。同样,如果左操作数的计算结果为true,||将不会评估右操作数。

更短的答案是,虽然&&是强烈和启发,它的设计采取一定的编程特点考虑在内,并a && b或许应该宁可被表述为“返回false,如果a是假的表达,和值b如果a为真“。

0

连词是另一个词“和”。所以他们在输出方面都是正确的。

就其实际给出输出而言,&&通常不会评估第二个参数,如果第一个参数为假。

+0

'通常'?这不是在C#标准中定义的吗? – jgauffin 2011-04-15 09:16:02

+0

@jgauffin:我的意思是“通常”,如“在大多数语言中”。 – Mehrdad 2011-04-15 09:25:19

+0

问题用'c#'标记。 – jgauffin 2011-04-15 09:29:12

1

简单的答案。

它对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未被分配。最后一个例子]

我希望能清理一些东西。