C언어, 대입연산자의 좌측 피연산자에 사용된 캐스팅 연산자

gurumong의 이미지

몇일전 IRC채널에서 이것에 대해서 이야기가 오갔는데

double a;
(int)a = 3;

위와 같이 대입연산자의 좌측 피연산자에 캐스팅 연산자가 사용되었을경우 표준은 어떻게 정의하고 있는지요?

1. 대입연산자 보다 캐스팅 연산자가 더 우선순위가 높다(그래서 먼저 처리되는)
2. 캐스팅 연산자를 사용하면 대상체가 아닌 값의 데이터형에 영향을 준다(좌변값의 데이터형 해석에만 관여한다)
3. 대입연산자의 좌측에 오는 피연산자는 수정가능한 좌변값이여야 하고 값으로 변하지 않고 대상체 본연의 의미를 가진다

이러한 정리에서 추측하기에;;
대입연산자의 좌측 피연산자에 캐스팅 연산자를 사용하면
a는 좌변값에서 형변환된 값으로 변하게 되고 그렇게 변한 우변값은 수정가능한 좌변값이 아니기에 대입연산자의 좌측피연산자로 사용할수 없다
또는 보다 우선순위가 높은 캐스팅 연산자에 의해서 허공에서 값이 형변환이 일어나지만 사용하지 않아 곧 바로 버려지고
대입연산자에 의해서 3는 암시적인 형변환(double로)이 일어나고 수정가능한 좌변값 a에 정상적인 대입이 일어난다
이렇게 두가지 정도로 추측이 되는데요

실제 표준은 이러한것에 대해서 어떻게 정의하고 있는지요?

전웅의 이미지

용어를 좀 다듬을 필요가 있긴 합니다만, 첫번째 해석

> a는 좌변값에서 형변환된 값으로 변하게 되고 그렇게 변한 우변값은 수정
> 가능한 좌변값이 아니기에 대입연산자의 좌측피연산자로 사용할수 없다
>

이 올바른 해석입니다.

보다 정확히는 캐스트 연산자의 피연산자로 좌변값이 주어지는 경우,
좌변값이 아닌 저장된 값이 취해지고 (따라서 이 순간부터 좌변값이
아닙니다), 캐스트 연산자를 적용한 결과 역시 항상 좌변값이 아닙니다.

과거 일부 컴파일러에서

int *p = &a;
((char *)p)++;   /* invalid in ISO C */

와 같은 수식을 허용해 주기도 했지만, 이와 같은 표준 해석에 따르면
실은 허용되지 않는 수식입니다.

최근 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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.