C의 시퀀스 포인트에 대해서 질문드립니다.(sequence point)

tagui의 이미지

ISO 9899를 참고하여 시퀀스포인트를 다음과 같이 정의해 보았습니다.

sequence point : 값이 메모리에 저장되는 시점. 어떤 시간대 (전체 수식의 평가가 끝난 시점, ||, &&, ?:, 콤마(comma) 연산자, 함수 호출 바로 이전)의 위치를 의미하는 것으로, 수식의 평가에서 이전 [*]side effect가 완료되었다는 것을 보증하는 지점.

side effect : volatile 객체 접근, 변수 값 변경, 파일 변경 이 세 가지 operation 또는 이런 operation들을 수행하는 함수 호출은 side effect이다. 이들은 수행환경의 상태를 변경시킨다.

예를 들어 statement가 다음과 같을 경우

b = ( a = 2, a * 3 ) + a * 4;

환경(컴파일러??)에 따라 수행결과가 바뀔 수 있다.
1. a = 2 가 수행되고 나서, a * 4가 수행 (a*3이 아닙니다.)
2. a * 4 가 수행되고 나서, a = 2가 수행

따라서 한 statement 에서는 하나의 시퀀스포인트만 존재해야 한다.

이렇게 정의를 내렸는데요.

<질문 1> 설명이 잘못되었거나 부족한 부분을 집어주셨으면 해요. 아직도 제가 정확히 이해하고 있지 않은 것 같아서 조언을 부탁드립니다.

<질문 2> 우선 콤마연산자에 대해서만 예를 들었는데 ||, &&, ?: 에 대해서는 머리속에 명확히 그려지지가 않네요.

<질문 3> 그리고 자바언어에서도 시퀀스포인트에 대한 정의가 C와 같나요? 자바는 시퀀스포인트를 고려할 필요가 없는지에 대해 궁금합니다.

feanor의 이미지

잘못 이해하시는 것 같네요. 콤마 연산자는 시퀀스 포인트니까 (a = 2, a * 3)이라면 a = 2가 항상 a * 3보다 먼저 수행됩니다. 시퀀스 포인트가 아닌 예를 들자면 f() + g()에서 f()가 먼저 실행될지 g()가 먼저 실행될지 알 수 없는 것입니다.

자바의 경우에는 언어 명세에 항상 왼쪽에서 오른쪽으로 평가한다고 명시되어 있으므로 f() + g()이면 항상 f()가 먼저 실행됩니다.

tagui의 이미지

답변 감사합니다.

네 a = 2가 항상 a * 3보다 먼저 수행되는 것이 이해가 가요.
제 질문이 좀 잘못된 것 같습니다.

a = 1 후에 a * 4 가 수행되는 경우,
a * 4 후에 a = 1 이 수행되는 경우

이 경우를 묻고 싶었어요.

시퀀스포인트는 환경에 따라 이렇게 두가지로 나누어 진다고 알고 있거든요.

자바의 경우에도 두가지로 나누어지나요?

winner의 이미지

저도 제대로 보지는 않았지만 Java의 경우는 문제가 일어나는 경우가 없는 것 같습니다.
a에 대한 것은 말씀하신대로 환경에 따라 두가지로 갈리는게 아니라 아예 정의되지 않을 것 같네요.

tagui의 이미지

댓글 달기

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