C언어, 대입연산자의 좌측 피연산자에 사용된 캐스팅 연산자
글쓴이: gurumong / 작성시간: 토, 2007/05/05 - 10:36오후
몇일전 IRC채널에서 이것에 대해서 이야기가 오갔는데
double a; (int)a = 3;
위와 같이 대입연산자의 좌측 피연산자에 캐스팅 연산자가 사용되었을경우 표준은 어떻게 정의하고 있는지요?
1. 대입연산자 보다 캐스팅 연산자가 더 우선순위가 높다(그래서 먼저 처리되는)
2. 캐스팅 연산자를 사용하면 대상체가 아닌 값의 데이터형에 영향을 준다(좌변값의 데이터형 해석에만 관여한다)
3. 대입연산자의 좌측에 오는 피연산자는 수정가능한 좌변값이여야 하고 값으로 변하지 않고 대상체 본연의 의미를 가진다
이러한 정리에서 추측하기에;;
대입연산자의 좌측 피연산자에 캐스팅 연산자를 사용하면
a는 좌변값에서 형변환된 값으로 변하게 되고 그렇게 변한 우변값은 수정가능한 좌변값이 아니기에 대입연산자의 좌측피연산자로 사용할수 없다
또는 보다 우선순위가 높은 캐스팅 연산자에 의해서 허공에서 값이 형변환이 일어나지만 사용하지 않아 곧 바로 버려지고
대입연산자에 의해서 3는 암시적인 형변환(double로)이 일어나고 수정가능한 좌변값 a에 정상적인 대입이 일어난다
이렇게 두가지 정도로 추측이 되는데요
실제 표준은 이러한것에 대해서 어떻게 정의하고 있는지요?
Forums:
용어를 좀 다듬을
용어를 좀 다듬을 필요가 있긴 합니다만, 첫번째 해석
> a는 좌변값에서 형변환된 값으로 변하게 되고 그렇게 변한 우변값은 수정
> 가능한 좌변값이 아니기에 대입연산자의 좌측피연산자로 사용할수 없다
>
이 올바른 해석입니다.
보다 정확히는 캐스트 연산자의 피연산자로 좌변값이 주어지는 경우,
좌변값이 아닌 저장된 값이 취해지고 (따라서 이 순간부터 좌변값이
아닙니다), 캐스트 연산자를 적용한 결과 역시 항상 좌변값이 아닙니다.
과거 일부 컴파일러에서
와 같은 수식을 허용해 주기도 했지만, 이와 같은 표준 해석에 따르면
실은 허용되지 않는 수식입니다.
최근 csc 에 캐스트 연산의 결과가 좌변값이 아닌 이유를 묻는 글이
올라왔었고,
(http://groups.google.co.kr/group/comp.std.c/browse_frm/thread/83c86e8049933e4a)
만약 C 언어에서 좌변값 문맥에 캐스트 연산이 허용되었다면 어땠을까에
대한 상상도 언급되어 있습니다.
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기