programing tip

C, C ++, Java 및 C #의 사전 및 사후 증가 연산자 동작

itbloger 2020. 12. 24. 23:24
반응형

C, C ++, Java 및 C #의 사전 및 사후 증가 연산자 동작


면책 조항 : 이것은 실제 사례가 아닙니다. 이 언어들이 어떻게 작동하는지에 대한 이론적 인 질문 일뿐입니다.

포스트 및 프리 증가 연산자와 관련하여 C / C ++, C # 및 Java의 차이점은 정확히 무엇입니까?

이것이 VC ++ 10, Java 1.6 및 C # 4에서 얻은 것입니다.

int a = 2;
int b = a++ + a++;
int c = ++a + a++ + a++;

      +-----+------+------+----+
      |  C  | C++  | Java | C# |
+-----+-----+------+------+----+
| a   |  7  |  7   |   7  |  7 |
+-----+-----+------+------+----+
| b   |  4  |  4   |   5  | 5  |
+-----+-----+------+------+----+
| c   | 15  |  15  |  16  | 16 |
+-----+-----+------+------+----+

Java 및 C #은 왼쪽에서 오른쪽으로 표현식을 평가하며 부작용이 즉시 표시 됩니다.

C ++에서 하위 표현식의 평가 순서는 지정되지 않으며, 시퀀스 포인트를 개입하지 않고 동일한 객체를 두 번 수정하는 것은 정의되지 않은 동작입니다.


C ++, C, C # 및 Java 차이점에 대한 자세한 설명을 작성할 시간이 없습니다 . 나는 단순히 사전 및 사후 증가 연산자의 C # 동작이 완전히 지정 되었다고 말할 것입니다 (단일 스레드 시나리오에서; 원자성에 대해 알고 싶다면 다중 프로세서 약한 메모리 모델에서 읽기 및 쓰기 순서의 관찰에 대한 보장 및 그래서 당신은 그 연구를 스스로 할 수 있습니다.) 그것은 C와 C ++에서 완전히 지정되지 않았습니다. 컴파일러는 부작용을 재정렬하여 원하는 모든 작업을 수행 할 수 있습니다. 저는 Java를 사용한 적이 없으므로 Java가 무엇을하는지 추측하지 않을 것입니다.

C #에 대한 자세한 내용은 C # 사양을 읽어야합니다. 그것에 대해 간단히 알아 보려면이 질문에 대한 내 대답을 읽으십시오.

i ++와 ++ i의 차이점은 무엇입니까?

더 짧은 시간 동안 :

C # 식의 하위 식은 우선 순위 및 연관성에 따라 논리적으로 그룹화 된 다음 왼쪽에서 오른쪽으로 평가됩니다 . (예를 들어, A () + B () * C ()는 A (), B (), C ()를 차례로 평가합니다. 곱셈이 더하기 "앞에 오는"사실은 관련이 없습니다. 하위 표현식은 항상 평가됩니다. 좌에서 우로.)

하위 표현식의 평가로 인해 사전 또는 사후 증가 하위 표현식으로 인해 부작용이 발생 하면 결과가 생성 되기 직전 에 부작용이 발생 합니다 .


C ++에서 이것은 정의되지 않은 동작이므로 모든 대답이 정확합니다. 자세한 내용은 정의되지 않은 동작 및 시퀀스 지점 을 참조하십시오.

다른 언어에 대해서는 확실하지 않지만이 코드도 여기에서 올바르지 않을 것으로 예상합니다.

편집 :
C #에 대한 Eric Lippert의 답변을 참조하십시오. 그는 C #의 행동에 대한 나의 가정을 반증합니다.


C ++에서는 최소한이 정의되지 않은 동작입니다. C ++ 표준 인용 :

이전 시퀀스 포인트와 다음 시퀀스 포인트 사이에서 스칼라 객체는 표현식 평가에 의해 최대 한 번 수정 된 저장된 값을 가져야합니다.


Java 메모리 모델은로드 및 저장이 수행되는 순서를 보장하므로 모든 JVM에서 동일하게 나와야합니다 (내 생각에).

C ++ 는 동일한 작업 순서를 가지고있는 것처럼 보이지만 한 줄에 두 번 사용하면 다른 작업이 시작됩니다 (Vlad가 바로 거기에 있음). 다른 C ++ 컴파일러를 시도하면 다른 답변이 나올 수 있습니다.

C #의 작업 순서는 동일하지만 일관성을 보장하는 메모리 모델 (예 : Java)이 있지만 여기에는 많은 지식이 없습니다.


나는이 질문을 좋아하고 매우 좋은 설명을 찾았지만 평가 방법의 가치 로이 질문을 설명하고 싶습니다.

C #에 대한 지식이 없으므로 Java 및 C / C ++에 대해서만 이야기하겠습니다.

진술은 다음과 같은 방식으로 평가됩니다.

자바에서

명령문 ||||||||||||||||||||||||||||||||||||||||||||||||| |||||| 자취

int a= 2;                     a=2
int b= a++ + a++;             a=2, a=3

here value of a=4

int c = ++a + a++ + a++;      a=5, a=5, a=6

here value of a=7

C / C ++에서

문 추적

int a= 2;                     a=2
int b= a++ + a++;             a=2, a=2

here value of a=4

int c = ++a + a++ + a++;      a=5, a=5, a=5

here value of a=7

간단히 말해서 자바 표현식에서 왼쪽에서 오른쪽으로 이동하므로 두 번째 "a"에서 새 값을 가져오고 c / c ++에서는 먼저 전체 표현식을 평가 한 다음 명령문의 모든 피연산자를 증가시킵니다.

참조 URL : https://stackoverflow.com/questions/6457130/pre-post-increment-operator-behavior-in-cc-java-c-sharp

반응형