2015-04-29 3 views
0

Эти два утверждения возврата не кажутся равными, и мне интересно, почему?Почему эти два возвращения bool равны?

bool isFound = false; 
return isFound; 

Возвращает true независимо от значения isFound.

bool isFound = false; 
return isFound ? true: false; 

Возвращает значение isFound в этом случае false.

Я думаю, ответ может заключаться в том, что isFound является локальной переменной и уничтожается после завершения функции.

Возвращаемый тип функции - const bool, но const, похоже, не имеет значения.

bool SecventialSearch(int* arr, int size, int target, long* time){ 

struct timeval start, stop; 
bool isFound = false; 
long seconds, useconds; 
int* iter = arr; 

gettimeofday(&start, NULL); 

while (*iter != target && iter != &arr[size-1]) 
    iter++; 

if (*iter == target) 
    isFound = true; 

gettimeofday(&stop, NULL); 

seconds = stop.tv_sec - start.tv_sec; 
useconds = stop.tv_usec - start.tv_usec; 

*time = ((seconds)*1000000 + useconds); 
return isFound; 
} 

Возвращает true в следующем коде в главном, даже если цель не находится в массиве. Изменение к isFound? true: false; заставляет его работать должным образом.

if (SecventialSearch(testArr,testArrSize,5, &test)) 
    printf("Is true."); 
else 
    printf("Is false."); 

enter image description here

+0

Оба одинаковые. И «* Возвращает true независимо от значения isFound. *» Неверно. "* ... isFound - это локальная переменная и уничтожается после завершения функции. *" - Да, но вы не используете его адрес. Вы просто возвращаете значение (true или false). Таким образом, это не проблема. –

+6

Предоставьте [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). –

+0

Первый код возвращает false. Я не знаю, как он может вернуть true .... – LPs

ответ

1

Я предполагаю, что ваша переменная объявлена ​​как логический тип (bool isFound).

Выражение isFound ? true : false; является излишним.

Он будет вычисляться true если isFound верно, или если falseisFound ложно.

Он имеет то же самое поведение, что и просто написание isFound. Так return isFound ? true : false; эквивалентно return isFound;

То же самое относится и к коду, как

if (isFound) { 
    return true; 
} else { 
    return false; 
} 

который является таким же, как написание return isFound;

EDIT: Вы это сказали всегда возвращается true:

bool isFound = false; 
return isFound; 

http://ideone.com/KwmXZb

Двойной контроль остальной части кода. Только это обязательно вернет false.

+0

Весь ваш ответ основан на 'isFound' is' bool', и это либо 'true', либо' false'. Однако этот вопрос помечен как «C» и «isFound», хотя это «bool», может содержать любое ненулевое значение. Использование 'isFound? true: false; 'конвертировать ненулевое значение в' false' является хорошей практикой, а не избыточным. – user3528438

+0

@ пользователь3528438, обновленный ответ. – ericbn

+0

В C нет ссылок, поэтому кажется маловероятным, что функция возвращает ссылку. – Lundin

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