вызов функции с предварительным условием декремента, если - PullRequest
1 голос
/ 07 июня 2010
void display(int a)
{
  printf("\n%d",a);
  if(--a)
    display(a);
  printf("\n%d",a);
}

main()
{
  display(4);
}

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

Ответы [ 8 ]

1 голос
/ 07 июня 2010

Цикл будет следующим:

Display(4): print "4", call display(3).
    Display(3): print "3", call display(2).
        Display(2): print "2", call display(1).
            Display(1): print "1", dont call display(0), print "0", returns to Display(2).
        Display(2): print "1", returns to Display(3).
    Display(3): print "2", returns to Display(4).
Display(4): print "3", exits.

Таким образом, результат будет: 4 3 2 1 0 1 2 3

0 голосов
/ 07 июня 2010

Важно понять, как оценивается условие:

if (--a) означает: уменьшить на единицу, а затем проверить его значение

if (a--) означает проверить значение a, а затем уменьшить его на единицу

Таким образом, в первом случае решение о том, запускать ли код в блоке, принимается ПОСЛЕ того, как переменная уменьшается. С другой стороны, второй случай сначала оценивает переменную, а затем уменьшает ее (а затем запускает код в операторе if или нет в зависимости от результата оценки)

0 голосов
/ 07 июня 2010
  • Дисплей (4): печать «4», дисплей вызова (3), печать «3».
  • Дисплей (3): печать «3», дисплей вызова (2), печать «2».
  • Дисплей (2): печать «2», дисплей вызова (1), печать «1».
  • Дисплей (1): печать «1», не дисплей вызова (0) , печать «0».
  • Таким образом, результат будет: 4 3 2 1 0 1 2 3
0 голосов
/ 07 июня 2010

Вероятно, самый простой способ понять пример, подобный этому, - это просто скомпилировать его и затем пошагово пройти по нему в отладчике. Посмотрите на стек и посмотрите, как меняется значение.

0 голосов
/ 07 июня 2010

Функция печатает все числа от а и до тех пор, пока они не достигнут нуля, а затем печатает все числа в порядке возрастания, пока не достигнет а-1. вывод будет:

4
3
2
1
0
1
2
3

0 голосов
/ 07 июня 2010

в псевдокоде:

display(a):
  print a
  decrement a
  if a > 0, call display (a)
  print a

main
  display (4)
0 голосов
/ 07 июня 2010

Вы не дали много подробностей о том, что вы не понимаете. Надеюсь, это поможет:

// Declare Display function
void display(int a) 
{ 
// Print the value of a (passed in)
    printf("\n%d",a); 

// Reduce a by 1.  If the result is non-zero then recursively call the function with the value of a
    if(--a) 
        display(a); 

//Print the value of a again        
    printf("\n%d",a); 
} 

main() 
{ 
// Start with 4
    display(4); 
}
0 голосов
/ 07 июня 2010

Функция display вызывается рекурсивно, пока ее переданный параметр не станет равным 1. Вызов функции выведет 1 и затем 0 в конце последнего рекурсивного вызова.

Функция должна была иметь предварительное условие передачи положительного значения> = 1.

--a означает уменьшение значения на 1, а затем возврат результата. Таким образом, он будет вызывать только рекурсивно, когда! = 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...