c언어undefined behavior

bommy의 이미지

안녕하세요,, 대학교 1학년 전필 과목으로 c언어를 듣고 있는 학생입니다.
수업 내용 중에서 sequence point와 undefined behavior에 대한 내용이 나왔는데,
undefined behavior가 제대로 이해되지 않아 질문드립니다 ㅠㅠ

제가 이해한 바로는 undefined behavior는 컴파일러에 따라서 실행 결과가 다르게 나와
이식성을 떨어뜨리기에 사용하지 않는 편이 좋다는 것인데요,

예를 들어, a = i + i++; 식의 문장에서 후위수식연산자가 우선순위가 가장 높기에 먼저 실행되지만,
i값에 1이 더해지는 side effect는 sequence point 이전까지만 실행되면 될 뿐, 정확한 순서까지는
알 수 없기 때문에 컴파일러에 따라서 a = (i+1) + i이 되거나, a = i + i이 될 수 있다는 것입니다.
(맞나요?ㅠㅠ)

제 교수님께서는 수업에서 후위수식연산자에 대해서만 다루셨는데, 전위수식연산자는 어떤 식으로 처리되는지
궁금합니다..

x = y = 1;
z = x / ++x;
- 이런 식이 존재한다면, 후위수식연산자와는 달리 x값에 1이 추가된 상태로 나누어져 1로 항상 고정되는 것인가요??(undefined behavior가 아닌 것인가요??)

z += -x++ + ++y;
- 이 경우, 후위증가연산자가 사용되긴 했지만, 값이 달라질 수 있는 여지가 없기에, undefined behavior로 취급하지 않는 것인가요??

제가 프로그래밍이 처음이라 아는 게 없습니다 ㅠㅠ
도와주세요ㅜㅜ

ymir의 이미지

undefined behavior 는 한 마디로 표준에 정의되어 있지 않은 행위라고 보시면 됩니다. 그래서 컴파일러의 구현에 의존적이고, 이 때문에 서로 다른 컴파일러나 옵션에 따라 예상과는 다른 결과가 나올 수도 있는 것이죠.

물론 undefined behavior 가 되는 케이스에 대해서도 자세히 언급을 해뒀는데, 두 sequence point 사이에서 object 가 두 번 이상 변경되거나, object 를 변경하고 저장할 값을 결정하지 않은 상태에서 이전의 값을 읽는 경우에는 undefined behavior 라고 되어 있습니다.

http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
J.2 Undefined behavior
-- Between two sequence points, an object is modified more than once, or is modified and the prior value is read other than to determine the value to be stored (6.5).

그래서 a = i + i++; 라는 식을 보면 i 를 읽는게 먼저인지, i++ 이 먼저 계산될지(저장될지) 알 수 없기 때문에 undefined behavior 가 되는거죠. ++ 이 + 보다 우선순위가 높다는 건 최종적으로 + 하기 전에 ++ 이 먼저 계산된다는 뜻이지, 앞의 i 보다 먼저 계산이 보장된다는 의미는 아닙니다.

z = x / ++x; 도 위와 같은 맥락에서 undefined behavior 가 됩니다.

z += -x++ + ++y; 는 각각의 object 가 한 번씩만 계산되었기 때문에 문제가 없습니다.
전위냐 후위냐는 아무런 상관이 없습니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

bommy의 이미지

감사합니다!!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.