C의 시퀀스 포인트에 대해서 질문드립니다.(sequence point)
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와 같나요? 자바는 시퀀스포인트를 고려할 필요가 없는지에 대해 궁금합니다.
아닙니다
잘못 이해하시는 것 같네요. 콤마 연산자는 시퀀스 포인트니까 (a = 2, a * 3)이라면 a = 2가 항상 a * 3보다 먼저 수행됩니다. 시퀀스 포인트가 아닌 예를 들자면 f() + g()에서 f()가 먼저 실행될지 g()가 먼저 실행될지 알 수 없는 것입니다.
자바의 경우에는 언어 명세에 항상 왼쪽에서 오른쪽으로 평가한다고 명시되어 있으므로 f() + g()이면 항상 f()가 먼저 실행됩니다.
질문이 좀 잘못되었네요.
답변 감사합니다.
네 a = 2가 항상 a * 3보다 먼저 수행되는 것이 이해가 가요.
제 질문이 좀 잘못된 것 같습니다.
a = 1 후에 a * 4 가 수행되는 경우,
a * 4 후에 a = 1 이 수행되는 경우
이 경우를 묻고 싶었어요.
시퀀스포인트는 환경에 따라 이렇게 두가지로 나누어 진다고 알고 있거든요.
자바의 경우에도 두가지로 나누어지나요?
Java 명세 한번 보시고요.
저도 제대로 보지는 않았지만 Java의 경우는 문제가 일어나는 경우가 없는 것 같습니다.
a에 대한 것은 말씀하신대로 환경에 따라 두가지로 갈리는게 아니라 아예 정의되지 않을 것 같네요.
ㅁ
ㅁ
댓글 달기