我遇到奇怪问题的下面的代码意味着修剪整数数组的未使用部分,然后将其转换为字符串。
例如:ABC_DE______将成为_ABC__DE。
…
&& 不是可交换的。它首先计算左操作数,然后在左操作数计算到时停止 0 。
&&
0
您的原始代码失败,因为它在某些时候会进行评估 chars[-1] (什么导致 未定义的行为 如果 chars 是一个数组)。替代版本没有这个问题,因为它执行 >= 0 使用前测试 inputLength 作为数组索引。
chars[-1]
chars
>= 0
inputLength
&& 在某种意义上是可交换的 a && b 与结果相同 b && a 。但是内置的运营商 && 有个 短路行为 。这意味着,如果结果 a && b 可以通过单独评估第一个操作数来决定,第二个操作数不被评估。
a && b
b && a
所以当第一个操作数是 chars[inputLength] == defaultChar 和 inputLength 是 -1 ,您进入未定义行为的领域,这意味着程序的行为是不可预测的。但是通过变通办法,你 的 避免 强> 未定义的行为因为 inputLength >= 0 和 inputLength < 0 检查,因此代码按预期工作。
chars[inputLength] == defaultChar
-1
inputLength >= 0
inputLength < 0
正如@PeteBecker所说: a() && b() 如果是的话,也不是可交换的 a() 要么 b() 有副作用。
a() && b()
a()
b()