Maliaty 发表于 2024-10-8 15:30:57

逻辑运算符与赋值,以及短路运算

上面a不是已经被赋值成3了吗?为什么下面输出不输出3而是小括号里的赋值呢?而且&&不是逻辑运算符吗?不应该是判断(a=0)为假,(b=5)为假,所以输出 a=0,b=0吗?

FishC 发表于 2024-10-8 15:31:10

在逻辑运算符中,特别是使用和赋值一起时,容易出现一些误解。这里我们需要重点了解以下几点:

1. **逻辑运算符与短路运算**:`&&` 和 `||` 是短路运算符,`&&` 在第一个条件为假时便不再计算第二个条件,`||` 在第一个条件为真时便不再计算第二个条件。

2. **赋值语句返回值**:当你写 `a = 3` 这样的赋值语句时,它的返回值是 `3`。因此 `(a = 0)` 在逻辑运算中被视为 `False`(因为 `0`是假),而 `(b = 5)` 虽然看似是赋值,但它的返回值是 `5`,被视为 `True`。

3. **逻辑表达式组合**:在混合使用逻辑运算符和赋值符号时,要注意逻辑表达式是如何评估的。比如下面的例子:
   a = (a = 0) && (b = 5);
   - 首先 `(a = 0)` 执行,`a` 被赋值为 `0`,该表达式返回 `0`(或 `False`)。
   - 因为 `&&` 的短路特性,如果第一个操作数是 `False`,第二个操作数就不会执行,所以 `(b = 5)` 不执行。
   - 所以最终 `a` 的值是 `0`。

因此,代码执行后看到的结果是因为赋值表达式与逻辑操作符的组合使用。要避免混淆,分开赋值和逻辑运算可能更清晰。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

Maliaty 发表于 2024-10-8 15:37:48

FishC 发表于 2024-10-8 15:31
在逻辑运算符中,特别是使用和赋值一起时,容易出现一些误解。这里我们需要重点了解以下几点:

1. **逻 ...

“`(b = 5)` 虽然看似是赋值,但它的返回值是 `5`,被视为 `True`。”这句不理解,b不是一开始被赋值为3了吗,3!=5,应该是false啊

FishC 发表于 2024-10-8 15:38:02

Maliaty 发表于 2024-10-08 15:37
“`(b = 5)` 虽然看似是赋值,但它的返回值是 `5`,被 ...

抱歉,可能我之前的解释有些不够清晰。这里我们主要关注赋值表达式的运作机制。

### 赋值语句的本质
当你执行一个赋值操作,例如 `(b = 5)`,这里有两个关键点:

1. **赋值发生**:变量 `b` 被重新赋值为 `5`,此时 `b` 的值不再是之前的任何值,而是新值 `5`。
   
2. **返回值**:赋值操作的返回值是被赋给变量的值。因此 `(b = 5)` 不仅把 `5` 赋给了 `b`,而且该赋值表达式本身的值(返回值)是 `5`。

### 在逻辑运算中的表现
对于逻辑运算(比如在 `&&` 表达式中),数值 `5` 被视为 `True`,因为在大多数编程语言中,非零值通常代表 `True`。

### 结合例子

假设我们有如下代码:

int a = 3;
int b = 3;
a = (a = 0) && (b = 5);

- `(a = 0)` 执行后,`a` 变为 `0`,该表达式返回 `0`,即 `False`。
- 由于 `&&` 的短路特性,`0 && (b = 5)` 会立刻返回 `False` 而不再执行 `(b = 5)`。所以 `b` 不会重新赋值,仍然是 `3`。
- 最终,`a` 被赋值为 `0`。

希望这个解释能帮你更好地理解赋值操作符和逻辑运算符在一起使用时的行为。如果还有困惑,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 逻辑运算符与赋值,以及短路运算