사후 증가 및 사전 증가 개념?
접미사 및 접두사 증가 또는 감소의 개념을 이해하지 못합니다. 누구든지 더 나은 설명을 할 수 있습니까?
지금까지 네 가지 답변은 모두 특정 이벤트 순서를 주장한다는 점에서 정확하지 않습니다 .
"도시의 전설"이 많은 초보자 (및 전문가)를 타락하여 표현의 정의되지 않은 행동에 대한 끝없는 질문의 흐름을 재치로 이끌었다 고 믿습니다.
그래서.
기본 제공 C ++ 접두사 연산자의 경우
++x
lvalue x로 증분 및 생성 (표현식 결과)x
x++
x의 원래 값을 증가 시키고 (표현식의 결과로) 생성합니다 x.
특히, 의 원래 값의 증가 및 생산에 대해 암시 된 시간 주문x++ 이 없기 때문 입니다 . 컴파일러는의 원래 값을 생성하는 기계어 코드를 자유롭게 생성 할 수 있습니다. 예를 들어 일부 레지스터에있을 수 있으며 표현식이 끝날 때까지 증분을 지연시키는 (다음 시퀀스 포인트).xx
증분을 잘못 믿고있는 사람들이 먼저 나타나야하며, 실제로 정의되지 않은 행동이있을 때 특정 표현이 잘 정의 된 효과를 가져야한다는 결론을 내리는 경우가 많습니다.
int i, x;
i = 2;
x = ++i;
// now i = 3, x = 3
i = 2;
x = i++;
// now i = 3, x = 2
'Post'는 이후를 의미합니다. 즉, 변수를 읽은 후에 증분이 수행됩니다. 'Pre'는 이전을 의미하므로 변수 값이 먼저 증가한 다음 표현식에 사용됩니다.
아무도이 질문에 대답하지 않았습니다. 이 개념이 왜 혼란 스럽습니까?
학부 컴퓨터 과학 전공자로서 코드를 읽는 방식 때문에 이것을 이해하는 데 시간이 걸렸습니다 .
다음은 올바르지 않습니다!
x = y ++
X는 y 포스트 증분 과 같습니다 . 논리적으로 X가 증분 작업이 완료된 후 Y 값과 동일하다는 것을 의미하는 것처럼 보입니다 . 뒤에 의미 를 게시 합니다 .
또는
x = ++ y
X는 y 사전 증가와 같습니다 . 논리적으로 X가 증가 연산이 완료 되기 전에 Y 값과 동일하다는 것을 의미하는 것처럼 보입니다 . 사전 의미 전에 .
작동 방식은 실제로 그 반대입니다. 이 개념은 언어가 오해의 소지가 있기 때문에 혼란 스럽습니다. 이 경우 행동을 정의하기 위해 단어를 사용할 수 없습니다.
x = ++ y는 실제로 X가 증분 후 Y의 값과 같으므로 읽습니다 .
x = y ++는 실제로 X가 증분 전의 Y 값과 같으므로 읽습니다 .
단어 pre와 post는 영어의 의미와 관련하여 거꾸로되어 있습니다. 그들은 ++가 Y 관계에있는 곳만을 의미합니다. 더 이상은 없습니다.
개인적으로 선택권이 있다면 ++ y와 y ++의 의미를 바꿀 것입니다. 이것은 제가 배워야하는 관용구의 한 예일뿐입니다.
이 광기에 대한 방법이 있다면 간단한 용어로 알고 싶습니다.
읽어 주셔서 감사합니다.
접미사 증가 x++와 접두사 증가 의 차이점 ++x은 정확히 두 연산자가 피연산자를 평가 하는 방법 에 있습니다. 접미사 증분은 개념적으로 메모리에서 피연산자를 복사하고 원래 피연산자를 증분하고 마지막으로 복사본의 값을 산출합니다. 코드에서 연산자를 구현하면 이것이 가장 잘 설명된다고 생각합니다.
int operator ++ (int& n) // postfix increment
{
int tmp = n;
n = n + 1;
return tmp;
}
기본 형식에 대한 연산자를 다시 정의 할 수 없기 때문에 위 코드는 컴파일되지 않습니다. 컴파일러는 또한 여기서 우리가 prefix 대신 postfix 연산자를 정의하고 있다고 말할 수 없지만 이것이 정확하고 유효한 C ++ 인 척합시다. 접미사 연산자는 실제로 피연산자에 대해 작동하지만 증분 이전의 이전 값을 반환하므로 표현식의 결과 는 증분 이전의 값입니다. 그러나 됩니다 증가.x++x
접두사 증가는 피연산자도 증가하지만 증가 후에 피연산자의 값을 산출합니다 .
int& operator ++ (int& n)
{
n = n + 1;
return n;
}
이는식이 증분 이후 의 ++x값으로 평가됨을 의미합니다 .x
++x따라서 표현식 이 assignmnet과 동일 하다고 생각하기 쉽습니다 (x=x+1). 그러나 증분 은 다른 상황에서 다른 것을 의미 할 수있는 작업 이기 때문에 정확하지 않습니다 . 간단한 원시 정수의 경우, 사실 ++x에 대한 대용입니다 (x=x+1). 그러나 연결된 목록의 반복자와 같은 클래스 유형의 경우 반복자의 접두사 증가가 "개체에 하나 추가"를 의미하지는 않습니다.
매우 간단합니다. 둘 다 변수 값을 증가시킵니다. 다음 두 줄은 동일합니다.
x++;
++x;
차이점은 증분되는 변수의 값을 사용하는 경우입니다.
x = y++;
x = ++y;
여기에서 두 줄 모두 y 값을 1 씩 증가시킵니다. 그러나 첫 번째는 x에 증분 이전의 y 값을 할당하고 두 번째는 x에 증분 후 y의 값을 할당합니다.
따라서 증분도 표현식으로 사용되는 경우에만 차이가 있습니다. 값을 반환 한 후 사후 증가가 증가합니다. 사전 증가는 이전에 증가합니다.
int i = 1;
int j = 1;
int k = i++; // post increment
int l = ++j; // pre increment
std::cout << k; // prints 1
std::cout << l; // prints 2
사후 증분은 값 i이에 할당 된 후 증분됨을 의미합니다 k. 그러나 사전 증분은 j 값이에 할당되기 전에 증분됨을 의미합니다 l.
감소에도 동일하게 적용됩니다.
사후 증분 (a ++)
int b = a ++이면
int b = a;
a = a+1;
여기서 우리는 값에 1을 더합니다. 증분이 이루어지기 전에 값이 반환됩니다.
예를 들어 a = 1; b = a ++;
그런 다음 b = 1 및 a = 2
사전 증가 (++ a)
만약 int b = ++ a; 그러면 이것은
a=a+1;
int b=a ;
사전 증가 : 기본 값에 1을 더합니다. 값은 증분 후에 반환됩니다. For a = 1; b = ++ a; 그런 다음 b = 2 및 a = 2입니다.
이제 인라인 자바 스크립트 스 니펫이 있으므로 pre 및 pos 증분의 대화식 예제를 추가하는 것이 좋습니다. C ++는 아니지만 개념은 동일하게 유지됩니다.
let A = 1;
let B = 1;
console.log('A++ === 2', A++ === 2);
console.log('++B === 2', ++B === 2);
post-increment (x ++) increament는 다음 문에서 발생합니다.
비명을 지르는 예 :
static void Main(string[] args)
{
int x = 0;
int y= Method(x++);//x=0
Console.WriteLine(x);// now x=1
Console.WriteLine(y);// but y=0;
}
public static int Method(int x)
{
//when called value of x=0;
return x;//returns 0
}
Pre_increament (++ x) 비명은 현재 문에서 발생합니다.
선의의 예 :
static void Main(string[] args)
{
int x = 0;
int y= Method(++x);//x=1
Console.WriteLine(x);// now also x=1
Console.WriteLine(y);//y is 1
}
public static int Method(int x)
{
//inside x=1;
return x; //returns 1
}
C99 표준 (이상한 과부하를 제외하고 C ++은 동일해야 함)
6.5.2.4 후위 증가 및 감소 연산자
제약
1 접미사 증가 또는 감소 연산자의 피연산자는 규정되거나 규정되지 않은 실수 또는 포인터 유형을 가져야하며 수정 가능한 lvalue 여야합니다.
의미론
2 The result of the postfix ++ operator is the value of the operand. After the result is obtained, the value of the operand is incremented. (That is, the value 1 of the appropriate type is added to it.) See the discussions of additive operators and compound assignment for information on constraints, types, and conversions and the effects of operations on pointers. The side effect of updating the stored value of the operand shall occur between the previous and the next sequence point.
3 The postfix -- operator is analogous to the postfix ++ operator, except that the value of the operand is decremented (that is, the value 1 of the appropriate type is subtracted from it).
6.5.3.1 Prefix increment and decrement operators
Constraints
1 The operand of the prefix increment or decrement operator shall have qualified or unqualified real or pointer type and shall be a modifiable lvalue.
Semantics
2 The value of the operand of the prefix ++ operator is incremented. The result is the new value of the operand after incrementation. The expression ++E is equivalent to (E+=1). See the discussions of additive operators and compound assignment for information on constraints, types, side effects, and conversions and the effects of operations on pointers.
3 The prefix -- operator is analogous to the prefix ++ operator, except that the value of the operand is decremented.
The pre increment is before increment value ++ e.g.:
(++v) or 1 + v
The post increment is after increment the value ++ e.g.:
(rmv++) or rmv + 1
Program:
int rmv = 10, vivek = 10;
cout << "rmv++ = " << rmv++ << endl; // the value is 10
cout << "++vivek = " << ++vivek; // the value is 11
You should also be aware that the behaviour of postincrement/decrement operators is different in C/C++ and Java.
Given
int a=1;
in C/C++ the expression
a++ + a++ + a++
evaluates to 3, while in Java it evaluates to 6. Guess why...
This example is even more confusing:
cout << a++ + a++ + a++ << "<->" << a++ + a++ ;
prints 9<->2 !! This is because the above expression is equivalent to:
operator<<(
operator<<(
operator<<( cout, a++ + a++ ),
"<->"
),
a++ + a++ + a++
)
참고URL : https://stackoverflow.com/questions/4445706/post-increment-and-pre-increment-concept
'Program Club' 카테고리의 다른 글
| ASP.NET 페이지에서 JSON 개체 반환 (0) | 2020.11.19 |
|---|---|
| Unity 2.0 : ResolverOverride와 함께 Resolve를 사용하는 방법? (0) | 2020.11.19 |
| div가 전체 높이를 확장하려면 (0) | 2020.11.19 |
| 내 npm 모듈은 Mac OS X에서 어디에 설치해야합니까? (0) | 2020.11.19 |
| 모든 열거 형 값을 배열로 가져옵니다. (0) | 2020.11.19 |