Логическая переменная с оператором if

Я пытаюсь использовать логические переменные с двумя операторами if. Второе условие if никогда не оценивается как истинное. Может быть, это проблема с тем, как я определил свои логические переменные. Вы видите ошибку?

Вот код:

int x = 0;
boolean state1 = (x <= 10);
boolean state2 = (x > 10);

void setup() {
  Serial.begin(9600);
}

void loop() {

  x++;

  if (state1) {
    Serial.println("x <= 10");
  } else if (state2) {
    Serial.println(" x > 10");
  }

}

, 👍1

Обсуждение

Вы никогда не обновляете свои переменные состояния. Когда вы присваиваете значение в C, вы присваиваете *результат* формулы, *а не саму формулу.*, @Majenko

Я пытался присвоить два условия логическим переменным, так что да, как вы сказали, я присваивал формулу., @Zaffresky

Этот вопрос не касается Arduino, а является общим вопросом программирования., @StarCat


1 ответ


Лучший ответ:

1

Я попросил перенести этот вопрос в Stackoverflow, поскольку он не связан с Arduino.

Однако, чтобы ответить на ваш вопрос, вы назначаете логические значения перед запуском программы, поэтому они никогда не оцениваются повторно и всегда сохраняют свое начальное значение, исходя из того, когда x = 0.

Что вам следует сделать, так это переоценить их в цикле:

int x = 0;
boolean state1;
boolean state2;

void setup() {
  Serial.begin(9600);
}

void loop() {
  x++;
  state1 = (x <= 10);
  state2 = (x > 10);
  if (state1) {
    Serial.println("x <= 10");
  } else if (state2) {
    Serial.println(" x > 10");
  }
}

Кроме того, если состояние1 истинно, состояние2 всегда будет ложно, и наоборот, поэтому вам не нужно иметь два логических значения. Это даст:

int x = 0;
boolean state;

void setup() {
  Serial.begin(9600);
}

void loop() {
  x++;
  state = (x <= 10);
  if (state) {
    Serial.println("x <= 10");
  } else {
    Serial.println(" x > 10");
  }
}

Кроме того, вам не нужно определять логическое значение глобально, потому что оно нужно только внутри цикла и его не нужно "сохранять" из одного цикла в другой. Таким образом, вы получаете

int x = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  x++;
  boolean state = (x <= 10);
  if (state) {
    Serial.println("x <= 10");
  } else {
    Serial.println(" x > 10");
  }
}

Конечно, вы также можете напрямую проверить x <= 10 вместо того, чтобы сохранять его в логическом значении, но я предполагаю, что вам нужно логическое значение в другом месте внутри loop функция позже.

,

Да, я вижу проблему сейчас. Я видел несколько скетчей, где булевы переменные использовались в операторе if, и подумал, что могу использовать их для хранения самих условий. Я предполагал, что, поскольку условие теперь хранится/присваивается логической переменной, поэтому каждый раз, когда переменная используется, она автоматически сравнивает условие с текущим значением x. Но ваш код помог мне увидеть необходимость обновления переменных и их локального хранения. Теперь я понимаю это лучше. Спасибо, @Zaffresky

Пожалуйста... Правда, есть разница между объявлением переменных (boolean b) и присваиванием (b = x). Когда x изменяется, b не изменяется, пока вы не выполните новое присваивание (если это не указатель). Я предлагаю прочитать о C/C++, это делает использование Arduino намного более мощным)., @Michel Keijzers

Да, я планирую больше изучать C/C++, но на данном этапе я просто знакомлюсь с базовой электроникой и пишу простые скетчи для Arduino. Так что следующим шагом определенно будет углубление в C., @Zaffresky

Вы не можете ничего делать одновременно (я тоже все еще изучаю электронику), @Michel Keijzers