术语问题:&&&运算符



我读了很多资料,但它们的定义不同:

  • ,,逻辑运算符是逻辑的吗//我猜这是正确的

  • ,,是逻辑与运算符//I认为这是不准确的技术观点

  • ,,是执行条件运算符逻辑和//我认为这是对的和

虽然所有的理解都是正确的,但我认为第一个是最精确的。还是我弄错了?

在c#、Java、c++、C以及其他一些语言中,&&是一种布尔与运算符的编程语言实现。它被设计用来解释以下事实(在纯命题逻辑中不适用):

  • 对操作数求值可能在计算上很昂贵
  • 计算操作数可能会因异常而失败
  • 计算操作数可能会进入无限循环

因此,编程语言中的布尔表达式实际上有四种可能的结果:true, false,"异常"one_answers"无限循环"。在某些情况下,一个人有两个布尔表达式,其中第二个表达式是否成功可以通过查看第一个表达式来确定。例如,对于表达式foo != nullfoo.bar == 42,我们可以确定,如果第一个表达式为假,那么第二个表达式将失败。因此,&&操作符被设计为"短路":如果左操作数的计算结果为false,则不计算右操作数。在所有两个操作数都可以成功求值为true或false的情况下,该规则产生的结果与实际求值两个操作数的结果相同,但它允许在不牺牲安全性的情况下提高性能(因为可能根本不需要求右操作数)和提高紧凑性(如果注意构造表达式,使左操作数"保护"右操作数)。同样,如果左操作数的计算结果为true, ||将不计算右操作数。

一个简短的回答是,尽管&&受到AND的强烈启发,但它的设计考虑了某些编程特性,而a && b可能更应该被表述为"如果a为假,则返回假的表达式,如果a为真,则返回b的值"。

简单的答案。

对两个返回布尔值的逻辑表达式执行与运算。如果第一个为假,则不计算第二个。

无论如何使用&

复杂的答案

http://www.ecma-international.org/publications/standards/Ecma-334.htm标题12.3.3.23似乎最相关。

我发现自己没有资格批评其中的定义。

12.3.3.23,,表达式

对于形式为expr-first && expr-second的表达式expr:

•v在expr-first之前的定赋状态与v在expr之前的定赋状态相同。

•如果在exprfirst之后的v的状态被确定赋值,或者"在真表达式后确定赋值",则在expr-second之前的v的确定赋值状态被确定赋值。

•expr后v的定赋值状态由:

0如果在expr-first之后的v的状态被明确赋值,则在expr之后的v的状态被明确赋值。

0否则,如果v在expr-second之后的状态被明确赋值,并且v在expr-first之后的状态为"在false expression之后被明确赋值",则表示v在expr之后的状态被明确赋值。

0否则,如果在expr-second之后的v的状态被明确赋值或"在true expression之后被明确赋值",则在expr之后的v的状态为"在true expression之后被明确赋值"。

0否则,如果在expr-first之后v的状态为"在false expression后明确赋值",在expr-second之后v的状态为"在false expression后明确赋值",则在expr之后v的状态为"在false expression后明确赋值"。

0否则,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可能测试为false,导致变量i被取消赋值。结束的例子)

我希望这能澄清问题。

连接是"and"的另一种说法。所以它们的输出都是正确的。

给出输出方面,如果第一个参数为假,&&通常不计算第二个参数。

最新更新