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# 의 사양을 참조해 주세요.이 질문에 대한 저의 답변을 읽어보시기 바랍니다.
더 짧은 테이크의 경우:
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
'programing' 카테고리의 다른 글
...vue.js의 mapState SyntaxError(vuex 사용) (0) | 2022.08.14 |
---|---|
로컬 스토리지에서 Vuex Store를 복원하기 전에 미들웨어 실행 (0) | 2022.08.14 |
VueJs: 텍스트 영역 입력 바인딩 (0) | 2022.08.14 |
Nuxt VueJ에서 직접 소품 변환 방지 (0) | 2022.08.13 |
Java의 경우 super() (0) | 2022.08.13 |