2017-01-23 2 views
2

Я хочу написать минимум функции, чтобы вернуть минимальное значение, которое было отправлено ему между вызовами. Функция может принимать любое количество аргументов, все из которых являются целыми числами в диапазоне от 0 до 100. Конец списка аргументов, переданных функции, представлен -1.Статическая переменная, которая не сохраняет свое значение

Например, если я вошел следующие вызовы в main:

minimum (90,78,5,20,-1); 
minimum (70,40,2,-1); 
minimum(40,30,-1); 

Первый вызов возвратит 5, так как минимальное значение 90,78,5,20 5. Второй вызов будет возвращать 2, поскольку минимальное значение 5,70,40,2 равно 2 Третий вызов будет возвращаться 2, поскольку минимальное значение 2,40,30 равно 2.

Таким образом, функция minimum возвращает минимальное число, которое было отправленные ему во всех вызовах, которые произошли до сих пор.

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

Вот что я получил:

#include <stdio.h> 
#include <stdarg.h> 

int minimum(int cnt, ...) 
{ 
    static int min; 
    int cur_min,i; 
    va_list lst; 

    va_start(lst,cnt); 
    cur_min = va_arg(lst,int); 
    min = cur_min; 

printf("min is %d and cur min is %d \n", min, cur_min); 
    for(i=0; i<cnt; i++) 
    { 
     if(cur_min != -1) 
     { 
      if(cur_min < min) 
      { 
       min = cur_min; 
      } 
      cur_min = va_arg(lst,int); 
      printf("min is %d and cur min is %d \n" , min, cur_min); 
     } 
     else 
      break; 

    } 

     va_end(lst); 

    return min; 

    } 





int main() 
{ 





    printf("In Call One: min is %d \n",minimum(90,78,5,20,-1)); 
    printf("In Call Two: min is %d \n", minimum(70,40,2,-1)); 
    printf("In Call Three: min is %d \n", minimum(40,30,-1)); 


    return 0; 
} 

Но я получаю следующий результат:

In Call Two: min is 2 
In Call Three: min is 30 

В то время как выход должен быть:

In Call Two: min is 2 
In Call Three: min is 2 

Похоже, хотя я ve объявила переменную min с использованием ключевого слова static, min не сохраняет свою ценность между вызовами.

Почему и как я могу сделать min сохранить его значение между вызовами функций?

+1

Обращайте внимание на правильность форматирования кода и удалите ненужные пустые строки. –

ответ

6

Статические переменные сохраняют свои значения между вызовами. Тем не менее, пожалуйста, позвольте мне обратить ваше внимание на несколько строк в коде:

cur_min = va_arg(lst,int); 
min = cur_min; 

Вы можете сделать это сразу же при входе в функцию. Таким образом, в то время как min- - имеет значение с последнего пролетел, вы переписываете его в каждые pass.

+0

Не могли бы вы объяснить это чуть подробнее? Если я это хорошо понимаю, то строка cur_min = va_arg (lst, int); min = cur_min; будет выполняться только один раз - перед входом в цикл for. Зачем это что-то переписывать? Разве это не инициализация? Я понимаю, что статические переменные сохраняют свою ценность, но в моем случае кажется, что это не так, поскольку если бы это было так, то в следующем вызове было бы значение 2 (это вызов три). Спасибо! – Tree

+1

Выполняется только один раз перед циклом for, но это делается * каждый раз, когда вы вызываете функцию *. Вот почему вы перезаписываете предыдущее значение 'min' –

+0

Если я это хорошо понимаю, то, поскольку min является статической переменной, он инициализируется только один раз. Если это так, то почему бы линия cur_min = va_arg (lst, int); min = cur_min; выполняться каждый раз, когда я вызываю функцию? Не следует ли инициализировать min, только при первом вызове функции? Спасибо – Tree

Смежные вопросы