Почему переменные в цикле (на языке C++) не изменяются так, как ожидается?

Я забыл некоторые нюансы работы с переменными в C++. 

Переменные изменяются, если они не считываются, но если попытаться их считать, то они перестают изменяться. Я проверил это на Arduino и в DevCpp. В старых проектах у меня не было такой проблемы — там я спокойно обращался к глобальным переменным, считывал их и перезаписывал, поэтому раньше не сталкивался с подобным вопросом. Единственная разница заключается в том, что я использовал другую среду (Atmel Studio) с неизвестными параметрами компилятора и версии C++.

В приведенном примере переменная A является локальной, B — глобальной, их значения считываются в цикле, в то время как C тоже локальная, но её значение в цикле не считывается.

```cpp
#include <iostream>

int* B = new(int);

int main(int argc, char** argv) {
    unsigned short A = 0;    
    *B = 0;
    unsigned short C = 0;

    while (1) {
        A += 1;
        *B = *B + 1;
        C += 1;

        if (A = 0) {};
        if (*B = 0) {};
//      if (C = 0) {};

        std::cout << A << "     " << *B << "     " << C << std::endl;    
    }
}
```

Уточните, пожалуйста, в чем именно заключается проблема, и как можно её решить.
  • 9 ноября 2024 г. 22:53
Ответы на вопрос 2
В вашем коде есть несколько ошибок и недочетов, которые могут вызвать непредвиденное поведение. Давайте разберем их по порядку и предложим решения.

1. **Оператор присваивания вместо оператора сравнения**:
   В строках `if (A = 0) {};` и `if (*B = 0) {};`, вы используете оператор присваивания `=` вместо оператора сравнения `==`. Это означает, что вам присваивается значение 0, и условие всегда будет истинным (если бы у вас не было переменной для проверки в условии). Замените `=` на `==`:

   ```cpp
   if (A == 0) {};
   if (*B == 0) {};
   ```

2. **Инициализация указателя**:
   Строка `int* B = new(int);` не инициализирует память должным образом. Вместо `new(int)` вам нужно использовать `new int` для выделения памяти для переменной типа `int`. В противном случае, поведение программы будет неопределенным. Поэтому измените на:

   ```cpp
   int* B = new int;
   ```

3. **Удаление выделенной памяти**:
   Вы должны обеспечить освобождение памяти, которую вы выделили при помощи `new`, чтобы избежать утечки памяти. В конце программы добавьте `delete B;`. Так как у вас бесконечный цикл, лучше добавить блокировку выхода, чтобы это освобождение произошло:

   ```cpp
   delete B;
   ```

4. **Бесконечный цикл**:
   Программа находится в бесконечном цикле `while(1)`, поэтому она будет продолжать выполняться, и вам не будет возможности увидеть значения переменных, если они не удовлетворяют некоторым условиям для выхода из цикла. Вы можете добавить условие для выхода или хотя бы паузу.

Вот исправленный вариант вашего кода:

```cpp
#include <iostream>

int* B = new int;

int main(int argc, char** argv) {
    unsigned short A = 0;    
    *B = 0;
    unsigned short C = 0;

    while (A < 10) { // Пример выхода из цикла для демонстрации
        A += 1;
        *B = *B + 1;
        C += 1;

        if (A == 0) {};
        if (*B == 0) {};
//      if (C == 0) {};

        std::cout << A << "     " << *B << "     " << C << std::endl;    
    }

    delete B; // Освобождение памяти
    return 0;
}
```

Теперь ваш код будет работать без ошибок, и вы получите ожидаемые значения для переменных `A`, `*B` и `C`. Не забывайте, что управление памятью и правильное использование операторов (`==` для сравнения, `=` для присваивания) — ключевые моменты для избежания проблем.
if (A = 0) {}; тут идет присвоение если надо сравнение то вероятно стоит if (A == 0) {}; )
Похожие вопросы