programing

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

yoursource 2022. 8. 14. 12:31
반응형

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

면책사항: 이것은 실제의 예가 아닙니다.그것은 단지 이 언어들이 어떻게 작동하는지 이론적인 질문일 뿐이다.

post 및 pre-increment 연산자의 경우 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++에서는, 서브 표현의 평가 순서가 지정되어 있지 않고, 간섭 시퀀스 포인트 없이 같은 오브젝트를 2회 수정하는 것은 정의되지 않은 동작이다.

C++, C, C#, Java의 차이점에 대한 자세한 설명을 쓸 시간이 없습니다.프리 인크리먼트 연산자와 포스트 인크리먼트 연산자의 C# 동작은 완전히 특정되어 있습니다(싱글 스레드 시나리오에서는 원자성에 대해 알고 싶다면 멀티프로세서 취약 메모리 모델에서의 읽기 및 쓰기 순서 관찰에 대해 보증하는 것 등).그 연구는 독자적으로 실시해야 합니다.이것은 C와 C++에 완전히 명시되어 있지 않다.컴파일러는 부작용의 순서를 바꿔서 하고 싶은 대로 할 수 있는 넓은 격자를 가지고 있다.저는 Java를 사용한 적이 없기 때문에 Java가 무엇을 하는지 추측하지 않겠습니다.

C# 의 상세한 것에 대하여는, C# 의 사양을 참조해 주세요.이 질문에 대한 저의 답변을 읽어보시기 바랍니다.

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

더 짧은 테이크의 경우:

C# 표현식의 서브 표현식은 우선순위와 연관성에 따라 논리적으로 그룹화되어 왼쪽에서 오른쪽으로 평가됩니다.(예를 들어 A() + B() * C()는 A()를 평가한 후 B()를 평가한 후 C()를 평가합니다.곱셈이 덧셈보다 먼저라는 사실은 관계가 없습니다.서브 표현식은 항상 왼쪽에서 오른쪽으로 평가됩니다.)

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

C++ 에서는, 이것은 정의되지 않은 동작이기 때문에, 어떠한 대답도 정확합니다.자세한 내용은 정의되지 않은 동작시퀀스 포인트를 참조하십시오.

다른 언어에 대해서는 잘 모르지만, 거기에서도 이 코드가 틀릴 것 같습니다.

★★★★★★
C# 에릭 리퍼트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-c-c-java-c-sharp

반응형