접두사(++x) 및 후픽스(x++) 작업은 어떻게 작동합니까?
접두사/사후 수정 연산자가 실제로 어떻게 작동하는지 누가 말해줄 수 있나요?인터넷으로 많이 찾아봤지만 아무것도 찾지 못했습니다.
우선순위를 먼저 정하고 그 다음에 작업을 하고 할당하는 것으로 알고 있습니다.
포스트픽스가 먼저 작업을 수행하고 할당한 다음 증분합니다.
하지만 코드에 문제가 좀 있습니다.
int x, y;
x = 1;
y = x + x++; // (After operation y = 2)(x=2)
하지만 내가 할 때는
y = x++ + x; // (After operation y = 3)(x=2)
저는 이 작업들이 왜 다를지 잘 모르겠습니다.두 가지 질문이 있습니다.
차이점을 설명해 주시겠습니까?
이것이 다른 연산자 Prefix에 어떻게 적용됩니까?
이 질문은 상당한 양의 질문을 받습니다.누군가가 이 질문을 할 때마다 많은 사람들이 오답을 게시한다는 것을 주의하세요.프로그래밍 책을 써서 다른 사람들에게 거짓을 가르치는 사람들을 포함하여, 많은 사람들이 이러한 운영자들이 어떻게 작동하는지에 대해 잘못된 생각을 가지고 있습니다.여기에 있는 다른 답들을 주의 깊게 읽어보세요.
C# 동작에 대한 정확한 분석은 다음을 참조하십시오.
C++의 경우 부작용을 관찰하는 경우에는 모든 동작이 올바른 동작입니다.C++는 증분의 부작용이 보이는 경우를 정의하지 않습니다.2개의 컴파일러는 다르게 할 수 있습니다.
준수해야 할 좋은 규칙은 어떤 언어에서도 부작용이 발생하는 순서에 의존하지 않는 것이지만, C++에서는 확실히 신뢰할 수 없기 때문에 의존하지 않는 것입니다.
특정 사례를 보려면 다음과 같이 하십시오.
int x, y;
x = 1;
y = x + x++;
당신은 x와 y가 둘 다 2라고 보고합니다.그것은 C#에서 맞습니다.C#에서 올바른 동작은 다음과 같습니다.
- y를 변수로 평가합니다.
- x를 값으로 평가합니다. 즉, 1입니다.
- x++를 값으로 평가합니다.x를 변수로 평가한 다음 원래 값인 1을 취한 다음 그 값인 2를 증가시킨 다음 2를 x에 할당한 다음 원래 값인 1을 생성합니다.
- 1 + 1, 즉 2를 평가합니다.
- 장난감 2개를 배정합니다.
그래서 x와 y는 둘 다 C#에서 2입니다.
C++도 동일한 작업을 수행할 수 있지만, 오른쪽에서 왼쪽 순서로 덧셈을 평가하는 것은 허용됩니다.즉, 다음을 수행하는 것이 허용됩니다.
- x++를 값으로 평가합니다.x를 변수로 평가한 다음 원래 값인 1을 취한 다음 그 값인 2를 증가시킨 다음 2를 x에 할당한 다음 원래 값인 1을 생성합니다.
- x를 값으로 평가합니다. 즉, 2입니다.
- 1 + 2, 즉 3을 평가합니다.
- y를 변수로 평가합니다.
- 장난감 3개를 배정합니다.
C++도 다음과 같이 할 수 있습니다.
- x++를 값으로 평가합니다.이것은 x를 변수로 평가한 다음 원래 값을 1로 한 다음 2 ...단계 누락된 값을 증가시키고 원래 값을 1로 합니다.
- x를 값으로 평가합니다. 즉, 1입니다.
- 1 + 1, 즉 2를 평가합니다.
- x에 2를 할당합니다. - 이전에 누락된 단계입니다.
- y를 변수로 평가합니다.
- 장난감 2개를 배정합니다.
따라서 C++에서는 컴파일러 작성자의 변덕에 따라 y를 3 또는 2로 얻을 수 있습니다.C#에서는 항상 y가 2임을 알 수 있습니다.C++에서 증분의 할당은 발생하는 한 언제든지 발생할 수 있습니다.C#에서 증분 할당은 증분 값이 계산된 후 원래 값이 사용되기 전에 수행되어야 합니다.실행 중인 스레드에서 관찰하면 다른 스레드나 스레드에서 이 내용을 관찰하려고 하면 모든 베팅이 꺼집니다.
두 번째 예제에서는 다음과 같습니다.
y = x++ + x;
C#에서 필요한 동작은 다음과 같습니다.
- y를 변수로 평가합니다.
- x++를 값으로 평가합니다.x를 변수로 평가한 다음 원래 값인 1을 취한 다음 그 값인 2를 증가시킨 다음 2를 x에 할당한 다음 원래 값인 1을 생성합니다.
- x를 값으로 평가합니다. 즉, 2입니다.
- 1 + 2, 즉 3을 평가합니다.
- 장난감 3개를 배정합니다.
따라서 C#의 정답은 y는 3이고 x는 2라는 것입니다.
다시 말하지만, C++는 이러한 단계를 순서에 상관없이 수행할 수 있습니다.C++는 다음을 수행할 수 있습니다.
- x를 값으로 평가합니다. 즉, 1입니다.
- x++를 값으로 평가합니다.x를 변수로 평가한 다음 원래 값인 1을 취한 다음 그 값인 2를 증가시킨 다음 2를 x에 할당한 다음 원래 값인 1을 생성합니다.
- 1 + 1, 즉 2를 평가합니다.
- y를 변수로 평가합니다.
- 장난감 2개를 배정합니다.
역시 C++에서는 컴파일러 작성자의 변덕에 따라 y가 2 또는 3이라는 정답이 나옵니다.C#에서 정답은 y가 3이라는 것입니다.
- 에서 C#의
+좌-우 순서로 평가됩니다. - 및 에서 C C++의
+지정되지 않았습니다.
C#의 경우 예제는 다음과 같이 작동합니다.
y = x + x++;
^ x is 1
^ x is increased to 2, but the postfix increment returns the old value (1)
y = 2
y = x++ + x;
^ x becomes 2, but postfix increment returns the old value (1)
^ x is now 2 here
y = 3
C 및 C++에서:
출력은 Unspecified입니다.
참조 - C++03 표준:
섹션 5: 표현, 4절:
명시된 경우를 제외하고[예: && 및 ||에 대한 특별 규칙], 개별 사업자의 피연산자 평가 및 개별 표현식의 하위 표현 순서 및 부작용이 발생하는 순서는 미지정입니다.
C99 섹션 6.5에서.
연산자와 피연산자의 그룹화는 구문으로 표시됩니다.72) 함수 호출(&&&, ||, ?: 및 쉼표 연산자의 경우) 뒤에 명시된 것을 제외하고 하위 표현식의 평가 순서와 부작용이 발생하는 순서는 모두 지정되지 않습니다.
두 경우 모두 x가 사용된 후 증분이 적용되었습니다.1차에서는 다음과 같이 평가하였습니다: y = 1 + 1 (2로 증가)
두번째에
y = 1 (2로 증가) + 2.
그래서 다른 답을 얻으셨군요.
표정이.x++그리고.++x결과(또는 값)와 부작용을 모두 갖습니다.
만약 우리가 논의를 적분형 피연산자로 제한한다면, 결과는x++현재의 가치가 무엇이든 간에x는 것이다. 부작용은 증가합니다.x1. 그러므로 코드가 주어지면
x = 0;
y = x++;
결과는 다음이 될 것입니다.x== 1 그리고y== 0 (x그리고.y(적분형).
위해서++x, 결과는 1에 현재 값을 더한 값입니다.x. 부작용은 증가하는 것입니다.x1. 그러므로 코드가 주어지면
x = 0;
y = ++x;
결과는 다음이 될 것입니다.x==y== 1.
C와 C++를 C#과 구별하는 것은 피연산자를 평가할 때와 부작용을 적용할 때입니다.C#은 식의 피연산자가 항상 왼쪽에서 오른쪽으로 평가됨을 보장합니다.C 및 C++는 에 대해 왼쪽에서 오른쪽으로의 평가만 보장합니다.&&,||,?:, 쉼표, 함수 호출()연산자 - 다른 모든 연산자의 경우, 연산자를 평가하는 순서가 지정되지 않습니다.
마찬가지로, C#에서, 의 부작용은x++그리고.++x식을 평가한 후 즉시 적용되는 반면 C 및 C++는 다음 시퀀스 포인트 이전에 부작용을 적용하기만 하면 됩니다.
C#의 평가에 관한 규칙은 표현이 다음과 같은 것을 보장합니다.x = x++,a = b++ * b++,그리고.a[i] = i++잘 정의된 반면, C 및 C++ 언어 정의는 이러한 표현이 정의되지 않은 동작을 초래한다고 명시적으로 말합니다(어떤 결과도 가능합니다).
x + x + + + + x + + x는 의존하고 싶지 않은 병리학적 측면 effects 사례의 한 예입니다.x++와 ++x는 둘 다 x를 증가시키지만 x를 더하는 데 있어서 평가 순서는 정의되지 않습니다. 컴파일러는 어떤 '측면'을 먼저 평가할 것인지 선택할 수 있습니다.
고려 사항:
y = x + x++;
행동이 정의되었든 아니든 간에(C와 C++에서는 정의되지 않았습니다. 분명히 C#에서는 정의되지 않았습니다.), 여러분이 하려는 것이 무엇이든 간에, 그것을 더 잘 표현할 수 있는 방법이 있을 것입니다.
엄격한 좌-우 평가를 가정할 경우 위의 내용은 다음과 같습니다.
y = x * 2;
x ++;
인지 에게는 그 않습니다.=,*,그리고.++그리고 미래에 당신의 코드를 유지하는 사람들은 당신을 추적하고 싶어하지 않을 겁니다
아니면 당신은 글을 쓸 수도 있습니다.x + x아니면x << 1만약 당신이 컴파일러가 효율적인 코드를 생성할 것이라고 신뢰하지 않는다면, 그러나 그러한 불신은 보통 잘못된 것입니다.
만약 당신이 주장한다면, 당신은 다음과 같은 글을 쓸 수도 있습니다.
y = x++ * 2;
그건 제 개인적 취향으로는 좀 더 간결하지만, 그래도 분명하지는 않아요.
프로그래머들이 많은 시간을 보내는 다른 사람의 코드를 이해하고 싶다면 복잡한 표현을 이해하는 것이 중요할 수 있습니다.그러나 자신의 코드를 작성할 때는 키 입력을 저장하는 것(또는 연산자 우선 순위 차트를 얼마나 잘 알고 있는지 보여주는 것)보다 명확성이 더 중요합니다.
언급URL : https://stackoverflow.com/questions/7812178/how-do-prefix-x-and-postfix-x-operations-work
'programing' 카테고리의 다른 글
| Scala Spark에서 csv 파일을 데이터 프레임으로 읽는 동안 스키마 제공 (0) | 2023.10.05 |
|---|---|
| 우커머스: 쿠폰 적용/제거 시 에이잭스를 비활성화하는 방법? (0) | 2023.10.05 |
| Carma Jasmine 테스트 실행에서 각도 모듈을 사용할 수 (0) | 2023.10.05 |
| 동적으로 생성된 요소에 대한 jQuery "on create" 이벤트 (0) | 2023.10.05 |
| jQuery로 jquery가 선택한 선택 옵션을 재설정하려면 어떻게 해야 합니까? (0) | 2023.10.05 |