2014-11-19 6 views
0

Я не понимаю, выход из этого кода:Функция, возвращающая неправильное значение

#include <stdio.h> 
long func(long pass) 
{ 
    long ret; 
    long i = pass; 

    if (i == 6) 
    { 
     printf("i=%ld\n",i); 
     return i; 
    } 
    printf("ended\n"); 
} 

void main() 
{ 
    int j; 
    long it = 0; 
    for(j = 0; j < 12; j++) 
    { 
     printf("%ld\n",func(it)); 
     it++; 
    } 
} 

Выходные шоу «закончилась» и «6» каждый раз, кроме случаев, когда оно достигает I = 6, то время он печатает I = 6 и 6.

ПОЧЕМУ? Он не должен каждый раз ходить внутри i == 6?

+4

'func' делает ничего, если не вернется 'pass == 6'. Это неопределенное поведение. – AndyG

+4

большинство современных компиляторов увидели бы, что не каждый путь заканчивается оператором return (value) и должен был вызвать сообщение об ошибке/предупреждении. Предложите включить все предупреждения/ошибки (для использования gcc -Wall) и устранить проблему, прежде чем пытаться ее запустить. – user3629249

+0

Говоря о названии вопроса «Функция, возвращающая неправильное значение»: когда 'i! = 6', что бы вы считали правильным значением? – DavidO

ответ

3

Когда i не равно 6, вы запускаете конец функции без оператора return, что дает вам неопределенное поведение - все может случиться.

В этом случае он, вероятно, просто возвращает все, что происходит в аппаратном возвратном регистре в конце функции, которое может быть просто константой 6, поскольку компилятор мог бы поставить ее там для сравнения. Другой компилятор (или даже тот же самый компилятор, который выполняется в другой день) может дать вам другой результат.

+0

В C нет UB, если вызывающий код не обращается к возвращаемому значению (в отличие от C++) –

+0

@MattMcNabb: Но код OP * * * обращается к возвращаемому значению. – AndyG

+0

@ AndyG Я отвечал на первый абзац ответа Криса –

2

Когда i == 6 не соответствует действительности, выполнение заканчивается func, не встречая инструкции return. Это заставляет функцию возвращать неопределенное значение .

Затем линия printf("%ld\n",func(it)); получает доступ к неопределенному значению, которое вызывает неопределенное поведение.

0

управление достигает конец длинного FUNC (длинный), потому что оператор возврата находится внутри, если условие, которое терпит неудачу, если «я» не равно 6.

0
When i is not equal to 6 it throws the warning as :: warning C4715: 'func' : not all control paths return a value 
and returns an indeterminate values and printf("%ld\n",func(it)); prints that value like, 
ended 
1 
ended 
1 
ended 
1 
ended 
1 
ended 
1 
ended 
1 
i=6 
6 
ended 
6 
ended 
6 
ended 
6 
ended 
6 
ended 
6