переменная не учитывается, даже если функция вызывается снова и снова

#c #function #variables

#c #функция #переменные

Вопрос:

Я хочу, чтобы переменная «minne» подсчитывалась в большую сторону один раз при каждом запуске функции «multi», а затем выводила ее обратно на экран в основной функции. Однако этого не происходит, он застрял на сообщении мне, что я использовал функцию «0» снова и снова. Почему это?

 //Multi

#include <iostream>


//Deklarerar variablar
int a,b,x, minne;

//Deklarerar funktioner
int multi(int a, int b);

int main(void)
{
  using std::cout;
  using std::cin; 

  while(1 < 2)
  {
  cout << "Ge mig ett nummer som du vill multiplicera:n"; 
  cin >> a;
  cout << "n Och ett till tack: n";
  cin >> b;

  multi(a,b);

  cout << "n Summan av dessa tal är: " << x << "n";
  cout << "You have called the function: " << minne << " times.n";
  }

  return 0;
}

int multi(int a, int b)
{
  x = a * b;

  int minne = minne   1;

  return x, minne;
}
  

Комментарии:

1. Разве ваш компилятор не предупреждает об этом? int minne = minne 1 «использует» неинициализированную переменную (да, локальную!). Исправьте настройки сборки!

2. И я не совсем уверен, чего while (1 < 2) или return x, minne предполагается достичь..

3. Вам следует включить предупреждения компилятора на максимальных настройках и инвестировать в отладчик. StackOverflow — очень медленный процесс отладки кода.

4. @Tomalakgeret’kal Я бы отдал ему должное за то, что он придумал while (1 <2) бесконечный цикл. Не уверен, как выглядел первый, который я написал. @Adrian while(true) или while(1) работают так же хорошо и являются более традиционными. Оптимизировано независимо, но не так шокирующе для других.

Ответ №1:

Это потому, что у вас объявлена глобальная минна, а функция multi также объявляет локальную минну, которая скрывает глобальную минну

Ответ №2:

Вы скрываете глобальную minne с помощью локальной int minne — избавьтесь от int и просто напишите minne = minne 1 , или даже просто minne . Кроме того, вам не нужно ничего возвращать из функции, поскольку вы не используете результат.

Комментарии:

1. Похоже, что она вообще ничего не должна возвращать.

2. @Adrian: Она возвращается minne .

Ответ №3:

  1. Из функции можно вернуть только одну переменную.
  2. Переменная minne в main() равна 0, потому что ее область видимости глобальная и она была автоматически инициализирована значением 0. функция minne in multi() является локальной и «создается» при каждом вызове этой функции (уничтожается при выходе из функции).

Что вы хотите сделать, это:

 //Multi

#include <iostream>


//Deklarerar variablar
int a,b,x;
static int minne;

//Deklarerar funktioner
int multi(int a, int b);

int main(void)
{
  using std::cout;
  using std::cin; 

  while(1 < 2)
  {
  cout << "Ge mig ett nummer som du vill multiplicera:n"; 
  cin >> a;
  cout << "n Och ett till tack: n";
  cin >> b;

  multi(a,b);

  cout << "n Summan av dessa tal är: " << x << "n";
  cout << "You have called the function: " << minne << " times.n";
  }

  return 0;
}

int multi(int a, int b)
{
  x = a * b;

  minne = minne   1;

  return x;
}
  

Ответ №4:

Вы переопределяете ее.

Вместо

 int minne = minne   1;
  

Делать

 minne = minne   1;
  

Создание локальной переменной с тем же именем, что и глобальная, затеняет глобальную.

Кроме того, в чем смысл вашего оператора return? Что вы пытаетесь сделать, делая return x, minne; ? И вы даже не проверяете возвращаемое значение вообще…

Комментарии:

1. x возвращает сумму a и b, умноженную друг на друга.

2. @AdrianLarsson ваша функция не возвращает, x она возвращает minne . Я уверен, что это не то, что вы имели в виду. Вы используете оператор , не так, как следовало бы.

3. Как получилось, что тогда это действительно дало мне ответ на математическую задачу?

4. Потому что x это глобальная переменная, и вы отбрасываете возвращаемое функцией значение. Вот почему вам сказали, что функция вообще ничего не должна возвращать. Что я пытаюсь понять, так это то, что, по вашему мнению , делает оператор return x,minne .

5. @Adrian: Поскольку вы не используете результат функции, вы используете глобальную x , которая действительно содержит правильный результат.

Ответ №5:

Потому что то, что находится внутри multi, не является тем, что находится за его пределами. Вы повторно объявили ее как переменную, локальную для multi, это та, которая увеличивается, а затем теряется при возврате

Комментарии:

1. На самом деле в этом нет необходимости — minne он пытается увеличить значение является глобальным.

2. Я знаю, что вы это знаете, они это знают. Однако компилятор сделал так, как было сказано….