2012-02-11 4 views
0

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

int& getID(){ 
    static int r = 0; 
    return r++; 
} 

главная:

int main(){ 
    int a = getID(); 
    std::cout << "a=" << a << std::endl; 
    return 0; 
} 

Почему возвращает статическую переменную, как описано создает проблемы и не возвращает требуемое значение ?

+0

И что вы хотите получить? – mikithskegg

+0

no it wont печать все. Мое предположение из-за ++, но я не могу понять, почему он должен возвращать ссылку на r, но не дано – Itzik984

+0

Не могли бы вы после этого отправить полные программы в будущем? - sscce.org –

ответ

7

Вы используете пост-приращение (г ++, в отличие от ++ г). Результат post-increment является временным, и вы пытаетесь вернуть ссылку на это временное. Вы не можете этого сделать. Если вы хотите вернуть ссылку на r, вы можете использовать pre-increment, или вы можете просто выполнить приращение, а затем в отдельном заявлении вернуть r.

+0

спасибо, теперь я понимаю, почему ... – Itzik984

1

Он не возвращает ссылку на r, но имеет значение r, прежде чем он будет увеличен. И это, вероятно, потеряно в действии.

Попробуйте

r++; 
return r; 

или

return ++r; 
2

В чем вы работаете, это неопределенное поведение. Все может случиться.

r++ возвращает временное, и это UB возвращает временные ссылки по ссылке.

На моей платформе, например, она даже не компилируется.

0

Вы должны прочитать о префиксе и постфиксном операторе и о том, как they are implemented.

В принципе, ++i делает это (префикс):

i += 1; 
return i; 

И i++ делает (постфикс):

ans = i; 
i += 1; 
return ans; 

Согласно упомянутой странице, только префикс operator++ возвращает ссылку на модернизированной переменной. Postfix (i++) возвращает новую переменную.

1

Сделайте свою функцию возвращенной int не int & и все будет хорошо. Вы хотите вернуть значение нового идентификатора, а не ссылку на внутренние функции.

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