int main(void)
{
int value = 0x00110012;
short* p = (short*) & value;
printf("%hd %hd\n", *(p+1), *p);
return 0;
}
1.이거 왜 결과값이 17, 18인가요? 19,18이여야 되는거 아닌가요?
2.그리고 *(p+1)을 *++p 아니면 *(++p)로 바꾸면 왜 결과값이 17,17이 되는건가요?
3.그리고 위에서 value값을 0x00110013으로 바꾸면 결과값이 왜 17,19로 *(p+1) 값만 그대로인건가요?
c언어 문제 ㅈㄴ술술 풀다가 포인터가니까 ㅈㄴ막히네요....
형님들 답변좀 부탁드립니다 ㅠㅠㅠ
19는 어떻게 나온 것인지는 모르겠지만 1. short형은 16bit를 차지하기 때문에 value를 0x0012과 0x0011로 나누어서 읽게 됩니다. 더 자세한 것은 byte order를 알아야 하지만 우리가 흔히 사용하는 컴퓨터에서는 저런 순서로 출력이 되는 것이라고 알아둡시다.
2. 결론부터 말하자면, 정의되지 않습니다. 자세히 이야기를 해보자면,
https://en.cppreference.com/w/c/language/operator_precedence
여기에 의하면 ++p가 먼저 계산이 됩니다. ++p는 특히 p의 값을 업데이트를 하고 값을 반환하는 것이라고 생각하시면 됩니다. 즉, p + 1을 리턴하게 되는 것입니다. 그러니 그 뒤에 p를 부를 때는 기존의 p가 아닌 p + 1이 출력이 되는 것입니다.
2.5. 정리하면, p, p++, ++p 이런 연산을 한 expression에 사용하지 마세요.
3. 1에서처럼 나누게 되기 때문에 0x0013과 0x0011로 나누어서 읽게 되어, 출력이 17과 19가 되는 것입니다.