&&运算符的可交换属性问题

use*_*873 2 c++ embedded arduino logical-operators

我遇到奇怪问题的下面的代码意味着修剪整数数组的未使用部分,然后将其转换为字符串.

例如: _ABC__DE______会变成_ABC__DE.

输入填充默认字符时会出现问题.(示例中为"_").

sLength 是整数数组的长度 chars

有问题的代码:

  int inputLength = sLength - 1;

  while (chars[inputLength] == defaultChar && inputLength >= 0) {
    inputLength--;
  }

  inputLength++;

  Serial.println("input length: " + String(inputLength));
  // (in)sanity check
  Serial.println(inputLength);
  Serial.println(String(inputLength));
  Serial.println(inputLength <= 0);
  Serial.println(0 <= 0);
  Serial.println(inputLength == 0);
  Serial.println(0 == 0);

  if (inputLength <= 0) {
    //reset cursor position
    Serial.println("index set to 0");
    index = 0;
  } else {
    output = "";
    for (int i = 0; i < inputLength; i++) {
      char c = charSet[chars[i]];
      if (c == '_') {
        c = ' ';
      }
      output += c;
    }
    done = true;
  }
Run Code Online (Sandbox Code Playgroud)

给定数组填充的输出defaultChar:

input length: 0
0
0
0
1
0
1
Run Code Online (Sandbox Code Playgroud)

如果我正确解释,输出意味着偶数行上0> 0和0 =/= 0,但奇数行上0 <= 0和0 = 0.


我提出的解决方法正在取代

  while (chars[inputLength] == defaultChar && inputLength >= 0) {
    inputLength--;
  }
Run Code Online (Sandbox Code Playgroud)

使用以下之一

  while (inputLength >= 0 && chars[inputLength] == defaultChar) {
    inputLength--;
  }
Run Code Online (Sandbox Code Playgroud)

.

  while (chars[inputLength] == defaultChar) {
    inputLength--;
    if (inputLength < 0) {
      break;
    }
  }
Run Code Online (Sandbox Code Playgroud)

这两个都导致输出:

input length: 0
0
0
1
1
1
1
index set to 0
Run Code Online (Sandbox Code Playgroud)

为什么这会改变结果呢?据我所知,直到现在,&&运算符是可交换的.

是否有一些我缺少的东西

chars[inputLength] == defaultChar && inputLength >= 0

不等于

inputLength >= 0 && chars[inputLength] == defaultChar

如果它是相关的,这是使用IDE 1.8.8在旧的引导加载程序上运行328P Arduino Nano

M.M*_*M.M 5

&&不是可交换的.它首先计算左操作数,然后在左操作数计算到时停止0.

您的原始代码失败,因为它在某些时候进行了评估chars[-1](如果是数组,则导致未定义的行为chars).替代版本没有这个问题,因为它>= 0inputLength用作数组索引之前执行测试.