我一直在阅读相当多的消息来源,但他们的定义不同:
&安培;&安培;是逻辑的逻辑运算符 连接//我想这是正确的
&安培;&安培;是逻辑AND // I的运算符 认为这不准确 技术观点
虽然在理解方面都是正确的,但我会说第一个是最准确的。或者我错了?
答案 0 :(得分:3)
在C#,Java,C ++,C以及其他几种语言中,&&
是布尔AND运算符的编程语言实现。它旨在解释以下事实(不适用于纯命题逻辑):
因此编程语言中的布尔表达式确实有四种可能的结果:true
,false
,“异常”和“无限循环”。在某些情况下,一个有两个布尔表达式,其中第二个表达式的可能成功可以通过查看第一个表达式来确定。例如,使用表达式foo != null
和foo.bar == 42
,我们可以确定如果第一个表达式为false,则第二个表达式将失败。因此,&&
运算符被设计为“短循环”:如果左操作数的计算结果为false,则不计算右操作数。在两个操作数都成功评估为true或false的所有情况下,此规则产生的结果与实际评估两个操作数的结果相同,但它允许提高性能(因为可能根本不需要评估右操作数)和在不牺牲安全性的情况下增加紧凑性(如果一个人注意构造表达式,使左操作数“守卫”正确的一个)。同样,如果左操作数的计算结果为真,||
将不会计算右操作数。
一个较短的答案是虽然&&
受到AND的强烈启发,但它的设计目的是考虑某些编程特性,而a && b
或许应该被表述为“如果表达式返回false则表示错误a
为false,如果b
为真,则a
的值为“。
答案 1 :(得分:1)
答案很简单。
它对2个返回布尔值的逻辑表达式执行AND运算。如果第一个是假的,它不会评估第二个。
评估两者的使用情况&。
复杂的答案。
标题12.3.3.23中的http://www.ecma-international.org/publications/standards/Ecma-334.htm似乎最相关。
我发现自己没有资格在内部批评这个定义。
12.3.3.23&&表达式
对于
expr-first && expr-second
形式的表达式expr:•
expr-first
之前的v的明确赋值状态与expr之前的v的明确赋值状态相同。•如果
expr-second
之后的v的状态是明确赋值或“在真实表达后明确赋值”,则明确赋值exprfirst
之前的v的明确赋值状态。否则,它没有被无限期分配。•expr之后v的明确赋值状态由下式确定:
o如果明确赋予
expr-first
之后的v状态,则明确赋予expr之后的v状态。o否则,如果
expr-second
之后的v的状态是明确赋值的,并且expr-first
之后的v的状态是“在假表达后明确赋值”,那么expr之后的v的状态肯定是分配o否则,如果
expr-second
之后的v状态明确赋值或“真正表达后明确赋值”,则expr之后的v状态为“在真实表达后明确赋值”。o否则,如果expr-first之后的v的状态是“在false表达式之后明确赋值”,并且expr-second之后的v的状态是“在false表达式之后明确赋值”,那么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
可能已经测试为false,导致变量i
被取消分配。结束例子]
我希望能够解决问题。
答案 2 :(得分:0)
连词是“和”的另一个词。所以他们的输出都是正确的。
就他们实际提供输出的方式而言,如果第一个参数为假,&&
通常不会评估第二个参数。