증가 및 감소 연산자

Increment and decrement operators

증분감소 연산자는 각각 피연산자에 또는 피연산자에서 하나를 더하거나 빼는 단일 연산자다.그것들은 일반적으로 명령적인 프로그래밍 언어로 구현된다.C와 같은 언어는 각 연산자의 두 가지 버전(사전 버전과 사후 버전)이 약간 다른 의미를 가지고 있다.null

B에서 구문적으로 파생된 언어(C와 그 다양한 파생상품 포함)에서 증분 연산자는 다음과 같이 기록된다.++그리고 노쇠 연산자는 다음과 같이 기록된다.--몇몇 다른 언어는 inc(x)와 dec(x) 함수를 사용한다.null

증분 연산자는 증가하고 감소 연산자는 피연산자의 값이 1씩 감소한다.피연산자는 산술 또는 포인터 데이터 유형을 가지고 있어야 하며 수정 가능한 데이터 객체를 참조해야 한다.포인터 값은 메모리에 인접한 다음(또는 이전) 요소를 가리키는 양만큼 증가(또는 감소)된다.null

두 버전의 연산자를 모두 지원하는 언어:

  • 증가 전 및 감소 전 연산자는 피연산자를 1씩 증가(또는 감소)하며, 표현식의 값은 결과적으로 증가(또는 감소)한 값이다.
  • 증감후 및 감산후 연산자는 피연산자의 값을 1씩 증가(또는 감소)하지만, 표현식의 값은 증분(또는 감소) 연산 이전의 피연산자의 값이다.

증가/감소가 표현식이 아닌 언어(예: Go)에서는 하나의 버전만 필요하다(Go의 경우, 포스트 오퍼레이터만 해당).null

증분/감소 연산자는 피연산자를 수정하기 때문에 동일한 표현식 내에서 그러한 피연산자를 두 번 이상 사용하면 정의되지 않은 결과가 나올 수 있다.예를 들어 다음과 같은 표현에서x - ++x어떤 순서로 뺄셈과 증분 연산을 수행해야 하는지는 명확하지 않다.그러한 표현은 일반적으로 정의되지 않은 행동을 유발하므로 피해야 한다.null

C와 같이 입력된 포인터가 있는 언어에서 증분 연산자는 포인터를 해당 유형의 다음 항목으로 이동시켜 포인터 값을 해당 유형의 크기로 증가시킨다.포인터(올바른 유형)가 배열의 모든 항목을 가리킬 때, 증가(또는 감소)는 포인터 포인터가 해당 배열의 "다음"(또는 "이전" 항목)을 가리키도록 한다.포인터에 정수에 포인터 유형이 있을 경우 포인터를 증가시키면 다음 정수(일반적으로 4바이트 증가)를 가리킨다.[1]포인터에 종업원 대 유형의 포인터가 있는 경우 포인터를 증가시키면 다음 "직원"을 가리키게 된다. 직원 구조의 크기가 106바이트인 경우 포인터를 증가시키면 포인터가 106바이트가 증가한다.[2]null

다음의 C 코드 조각은 전후 증감 및 감쇠 연산자 간의 차이를 보여준다.

인트로 x; 인트로 y;  // 연산자 증가 // 사전 증가: x가 1씩 증가된 다음 y가 x의 값을 할당함 x = 1; y = ++x;    // x는 현재 2, y도 2  // 사후 증가: y에 x 값이 할당되고, 그 다음 x가 1씩 증가함 x = 1; y = x++;    // y는 1, x는 2  // 연산자 감소 // 사전 감소: x가 1만큼 감소된 다음 y에 x 값이 할당됨 x = 1; y = --x;    // x는 현재 0이고 y도 0임  // 감산 후: y에 x 값이 할당되고, 그 다음 x가 1만큼 감소함 x = 1; y = x--;    // y는 1, x는 0이다. 

이러한 연산자가 부족한 언어에서 동등한 결과는 코드 한 줄을 추가로 필요로 한다.

# 사전증가 : y = ++x x = 1 x = x + 1  # x는 이제 2(Python에서는 "x += 1"로 쓸 수 있음) y = x      # y도 2  # 사후증가 : y = x++ x = 1 y = x      # y는 1 x = x + 1  # x는 이제 2 


증분 후 연산자는 일반적으로 배열 첨자와 함께 사용된다.예를 들면 다음과 같다.

// 배열 요소의 합계 둥둥 뜨다 sum_sum(둥둥 뜨다 arr[], 인트로 n) {     둥둥 뜨다  합계를 내다 = 0.0;     인트로    i   =   0;      하는 동안에 (i < n)         합계를 내다 += arr[i++];    // i의 증가 후 단계                             // 배열의 n 요소     돌아오다 합계를 내다; } 

증분 후 연산자는 또한 일반적으로 다음과 같은 포인터와 함께 사용된다.

// 한 어레이를 다른 어레이에 복사 공허하게 하다 copy_array(둥둥 뜨다 *src, 둥둥 뜨다 *dst, 인트로 n) {     하는 동안에 (n-- > 0)        // n에서 0으로 카운트다운하는 루프         *dst++ = *src++;   // *(src) 요소를 *(dst)에 복사                            // 그런 다음 두 포인터를 모두 늘린다. } 

이러한 예는 C++, JavaC#와 같은 다른 C 유사 언어에서도 작동한다는 점에 유의하십시오.null

  • 증분 연산자는 다음과 같은 예를 통해 증명할 수 있다.
    #include <stdio.h> 인트로 본래의() {     인트로 c = 2;     활자화하다("%d\n", c++); // 이 문장은 2를 표시한 다음 c가 1에서 3으로 증가한다.     활자화하다("%d", ++c);   // 이 문장은 c가 1씩 증가하면 c가 표시된다.     돌아오다 0; } 
    • 출력:
      2 4

지원 언어

다음 목록은 완전하거나 모두 포함되지는 않지만, 다음 목록을 지원하는 주요 프로그래밍 언어 중 일부를 나열한다.++/--증분/증분 연산자null

(애플의 Swift는 한때 이러한 운영자들을 지원했지만 버전 3을 기점으로 지원이 삭제되었다.)[12]

파스칼, 델파이, 모둘라-2, 오베론 등은 같은 기능을 제공하지만 inc(x)와 dec(x)로 불린다.null

특히 파이톤러스트는 이러한 운영자를 지원하지 않는다.null

역사

이 개념은 1969년경 켄 톰슨에 의해 B 프로그래밍 언어로 소개되었다.[13]null

톰슨은 한 걸음 더 나아가 증가하거나 감소하는 ++와 -- 연산자를 발명했다; 그들의 접두사 또는 후처리 위치는 피연산자의 값을 기록하기 전이나 후에 변경이 발생하는지 여부를 결정한다.그들은 B의 초기 버전은 아니었지만 도중에 나타났다.사람들은 종종 C와 유닉스가 처음 인기를 끌었던 DEC PDP-11에서 제공하는 자동 증가와 자동 감소 주소 모드를 사용하기 위해 그들이 만들어졌다고 추측한다.B가 개발될 당시 PDP-11이 없었기 때문에 이것은 역사적으로 불가능하다.그러나 PDP-7은 몇 개의 '자동증가' 메모리 셀을 가지고 있었고, 이를 통해 간접 메모리가 참조하는 특성이 셀을 증가시켰다.이 특징은 아마도 톰슨에게 그러한 운영자들을 제안했을 것이다; 그것들을 접두사와 후처리 둘 다로 만드는 일반화는 그의 것이었다.실제로, 자동증대 셀은 사업자의 구현에 직접적으로 사용되지 않았으며, 기술혁신의 더 강력한 동기는 아마도 ++x의 번역이 x=x+1의 번역보다 작다는 그의 관찰이었을 것이다.

참고 항목

참조

  1. ^ 리처드 M 리스."C 포인터 이해사용"."4장. 포인터배열".2013년 오릴리 미디어ISBN: 9781449344184
  2. ^ 리처드 피터슨"C++와 함께 소개 C." 2019년.그림 12-12.
  3. ^ "GNU Awk's User Guide". Free Software Foundation.
  4. ^ "8.3. The Double-Parentheses Construct". The Linux Documentation Project.
  5. ^ Ritchie, Brian W. Kernighan; Dennis M.; Ritchie, Dennis (1988). The C programming language (2. ed., [Nachdr.] ed.). Englewood Cliffs, N.J.: Prentice Hall. p. 18. ISBN 0-13-110362-8.
  6. ^ "Increment/decrement operators". cppreference.com.
  7. ^ "++ Operator (C# Reference)". Microsoft Developer Network.
  8. ^ "Operator Overloading". dlang.org.
  9. ^ "GP Operators and their Priorities".
  10. ^ "About Assignment Operators".
  11. ^ "Increment Wolfram Language Symbol". Wolfram Language Documentation Center.
  12. ^ "Basic Operators". developer.apple.com.
  13. ^ Ritchie, Dennis M. (March 1993). "The Development of the C Language". ACM SIGPLAN Notices. 28 (3): 5. doi:10.1145/155360.155580.