c++ 참조 변수에 대한 질문
글쓴이: 심재혁@Google / 작성시간: 일, 2019/03/10 - 3:22오후
#include
#include
using namespace std;
bool isodd(int& number)
{
if (number % 2 == 1)
return true;
}
bool iseven(int& number)
{
if (number % 2 == 0)
return true;
}
void function1(array z, bool(*ptr)(int& kj))
{
for (auto& element : z)
{
cout << element << " " << ptr(element) << endl;
}
}
int main()
{
array z = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
function1(z, iseven);
function1(z, isodd);
}
이와 같이, 함수의 매개변수에 참조 변수를 붙여줘야 정상적으로 값이
0 2 4 6 8
1 3 5 7 9가 나오는데,
함수의 매개변수에 참조 변수를 때어내면 (int &number -> int number)
0 1 2 3 4 5 6 7 8 9
1 3 5 7 9
라는 이상한 결괏값이 옵니다 ㅠㅠ
물론, 짝/홀수를 판단하는 함수에 else를 붙여 false를 반환하지 않았지만,
저렇게 참조 변수가 붙느냐 안 붙느냐에 따라 결괏값이 달라지는 현상이 도무지
이해가 가지 않아서 감히 질문 드립니다 ㅠㅠ
Forums:
이상한 프로그램을 짰으니 이상한 결과가 나오는 것이죠
이상한 프로그램을 짰으니 이상한 결과가 나오는 것이죠.
당연한 일일 뿐 더 이해할 만한 것이 없습니다.
저런 결과가 나오는 과정이 알고 싶다면 컴파일러가 생성한 어셈블리를 한번 읽어 봅시다.
정확하진 않지만 대충 기억으로는
return이 빠지면 뭘 return할지는 undefined입니다. (혹은 였습니다.) 최적화 옵션을 줄 경우에는 당연히 컴파일러는 이 return에 뭐가 나갈지 생각하지 않고 defined 된 부분만은 정확히 지켜지도록 코드를 이리저리 가공할 테니 두 경우가 서로 다른 게 놀랍지 않습니다. 안 줄 경우에도 architecture마다 calling convention이 다르지만 intel은 eax에 리턴값을 넣는데 이렇게 return이 잘못 빠진 경우는 아무 것도 안 하고 eax를 그냥 리턴하게 됩니다. 그 결과 마지막에 남아 있던 값이 의도치 않게 나가게 되고요. reference를 넘기는 건 포인터 넘기는 거고 value를 넘기는 것과는 의미가 좀 다르기 때문에 연산도 다른 거고 가능한 최적화들의 집합도 조금 다르니까 서로 다른 결과가 나오는 게 이상한 일은 아니죠.
댓글 달기