2014-10-06 2 views
1

Этот фрагмент кода дает неожиданный результат. Когда я комментирую printf функции sumdig, возвращаемое значение a равно 6, а b равно 12, но при сохранении printf a равно 5, а b - 6. Пожалуйста, объясните.Как вы объясните несоответствие в выходе этого фрагмента кода?

main() 
{ 
    int a,b; 
    a = sumdig(123); 
    b = sumdig(123); 
    printf("\na=%d b=%d",a,b); 
    return 0; 
} 


int sumdig(int n) 
{ 
    static int s=0; 
    int d; 
    if(n!=0) 
    { 
     d=n%10; 
     n=(n-d)/10; 
     s=s+d; 
     sumdig(n); 
    } 
    else 
     return s; 
    printf("\n s=%d",s); 
} 
+4

Каждый путь функции non-void должен возвращать значение. Если это не так, я думаю, что в C это только UB, если используется возвращаемое значение, но кому это нужно? Во всяком случае, разве ваш компилятор не предупредил вас? – Deduplicator

+0

Что именно здесь вы называете неожиданным? Эффект добавления/удаления 'printf'? Или тот факт, что без 'printf' два, казалось бы, одинаковых вызова возвращают разные значения? – AnT

ответ

5

Если у вас нет явного оператора возврата функция INT с склонно возвращать любое значение было возвращено последней вызванной функции (хотя я считаю, что реальное поведение не определено). Поэтому вы возвращаете результат printf, когда хотите вернуть значение рекурсивного вызова sumdig.

Вместо sumdig(n);, попробуйте return sumdig(n);

2

право, во-первых, вы должны скомпилировать это с таким количеством предупреждений, как ваш компилятор даст вам.

Это покажет вам, что хотя sumdig возвращает значение, существует хотя бы один путь кода, который не возвращает ничего, чтобы вызывающий пользователь получал мусор.

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

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