2013-08-01 3 views
-4

두 가지 프로그램이 있습니다. 둘 다 함수 fun()를 가지며, 그 반환 유형은 정수에 대한 참조입니다. 두 함수의 차이점은 하나의 함수에서 x는 정적 int로 선언되는 반면 다른 함수에서는 차이가 없다는 것입니다. 첫 번째 질문에 대한 결과는 10이고 두 번째 질문에 대한 결과는 30입니다. 어떻게?이 두 프로그램의 결과물의 차이점은 무엇이며 그 이유는 무엇입니까?

프로그램 1 :

#include<iostream> 
using namespace std; 

int &fun() 
{ 
    int x = 10; 
    return x; 
} 
int main() 
{ 
    fun() = 30; 
    cout << fun(); 
    return 0; 
} 

프로그램 2 :

#include<iostream> 
using namespace std; 

int &fun() 
{ 
    static int x = 10; 
    return x; 
} 
int main() 
{ 
    fun() = 30; 
    cout << fun(); 
    return 0; 
} 
+2

첫 번째 프로그램은 정의되지 않은 동작을 호출하고 두 번째 프로그램은 정의되지 않은 동작을 호출합니다. –

+0

정의되지 않은 동작은 무엇입니까? 왜 두 프로그램의 출력 차이가 나는지 말해 줄 수 있습니까? – thedarkpassenger

+1

Google에 "정의되지 않은 동작"을 적용하면 이해할 수 있습니다. –

답변

2

프로그램 1 : 함수가 반환 자마자 존재 중단 변수에 대한 참조를 반환하고 값을 저장 (30) 당신의 머신을 크래쉬시킬 수도 있고 크지 않을 수도있는 존재하지 않는 변수로 옮길 수도 있습니다. 그럼에도 불구하고 fun()를 호출하면 지역 변수 "x"가 다시 초기화되어 반환됩니다.

프로그램 2 : 함수 범위의 정적 변수는 해당 함수에서만 액세스 할 수있는 전역 변수와 비슷합니다. 해당 정적 (아직 존재하는)에 대한 참조를 반환하고 그 값을 설정합니다. 함수를 다시 호출하면 정적에는 여전히 할당 된 값이 있습니다.

관련 문제