我读了很多资料,但它们的定义不同:
-
,,逻辑运算符是逻辑的吗//我猜这是正确的
-
,,是逻辑与运算符//I认为这是不准确的技术观点
- ,,是执行条件运算符逻辑和//我认为这是对的和
虽然所有的理解都是正确的,但我认为第一个是最精确的。还是我弄错了?
在c#、Java、c++、C以及其他一些语言中,&&
是一种布尔与运算符的编程语言实现。它被设计用来解释以下事实(在纯命题逻辑中不适用):
- 对操作数求值可能在计算上很昂贵
- 计算操作数可能会因异常而失败
- 计算操作数可能会进入无限循环
因此,编程语言中的布尔表达式实际上有四种可能的结果:true
, false
,"异常"one_answers"无限循环"。在某些情况下,一个人有两个布尔表达式,其中第二个表达式是否成功可以通过查看第一个表达式来确定。例如,对于表达式foo != null
和foo.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"的另一种说法。所以它们的输出都是正确的。
在给出输出方面,如果第一个参数为假,&&
通常不计算第二个参数。