x + = y와 같은 바로 가기가 모범 사례로 간주되는 이유는 무엇입니까?


305

나는 이것이 실제로 무엇이라고 불리는 지 모르지만, 나는 그것들을 항상 봅니다. 파이썬 구현은 다음과 같습니다.

x += 5에 대한 속기 표기법으로 x = x + 5.

그러나 이것이 왜 좋은 습관으로 간주됩니까? 나는 파이썬, C, R 등을 위해 읽은 거의 모든 책이나 프로그래밍 튜토리얼에서 그것을 읽었습니다 . 공백을 포함하여 세 번의 키 입력을 저장하는 것이 편리하다는 것을 알았습니다. 그러나 그들은 항상 내가 코드를 읽고있을 때 나를 여행하는 것, 적어도 내 마음에, 그것은 수 있도록 적은 더 읽을 수 없습니다.

이것들이 사방에 사용되는 분명하고 명백한 이유가 빠져 있습니까?


@EricLippert : C #에서 설명한 최상위 답변과 같은 방식으로 이것을 처리합니까? 실제로 더 효율적으로 CLR이 많다는 말을하는 것입니다 x += 5보다 x = x + 5? 아니면 당신이 제안한대로 진정으로 구문 설탕입니까?
blesh

24
@blesh : 소스 코드에 추가를 표현하는 방법에 대한 작은 세부 사항은 1970 년에 실행 가능한 코드의 효율성 에 영향을 미쳤습니다 . 확실히 지금은 아닙니다. 컴파일러를 최적화하는 것이 좋으며 여기저기서 1 초보다 큰 걱정거리가 있습니다. + = 연산자가 "20 년 전에"개발되었다는 생각은 분명히 잘못된 것입니다. 데니스 리치 후기는 벨 연구소에서 1969 년부터 1973 년까지 C를 개발했다.
Eric Lippert

1
참조 blogs.msdn.com/b/ericlippert/archive/2011/03/29/... (또한 두 번째 부분 참조)
SLaks

5
대부분의 기능 프로그래머는이 나쁜 습관을 고려할 것입니다.
피트 커크

답변:


598

속기는 아닙니다.

+=기호는 1970 년대에 C 언어로 나타 났으며, "스마트 어셈블러"라는 C 개념은 분명히 다른 기계 명령 및 어드레싱 모드에 해당합니다.

" i=i+1", "i+=1"및" ++i"와 같은 것은 추상적 수준에서는 동일한 효과를 생성하지만 낮은 수준에서는 프로세서의 다른 작동 방식에 해당합니다.

특히 i변수가 CPU 레지스터에 저장된 메모리 주소에 있다고 가정하면 (이름을 D"포인터에 대한 포인터"로 간주) 프로세서 의 ALU 는 매개 변수를 사용하여 결과를 반환합니다. "누적 기"(A라고 부릅니다-정수라고 생각하십시오).

이러한 제약 조건 (해당 기간의 모든 마이크로 프로세서에서 매우 흔함)으로 인해 번역이 발생할 가능성이 높습니다

;i = i+1;
MOV A,(D); //Move in A the content of the memory whose address is in D
ADD A, 1;  //The addition of an inlined constant
MOV (D) A; //Move the result back to i (this is the '=' of the expression)

;i+=1;
ADD (D),1; //Add an inlined constant to a memory address stored value

;++i;
INC (D); //Just "tick" a memory located counter

이를 수행하는 첫 번째 방법은 최적이 아니지만 상수 ( ADD A, B또는 ADD A, (D+x)) 대신 변수를 사용하여 조작 하거나 더 복잡한 표현식을 변환 할 때 (일반적 으로 스택에서 우선 순위가 낮은 푸시 조작에서 모두 종료 됨) 모든 주장이 없어 질 때까지 반복하십시오.)

두 번째는 "상태 머신"의보다 전형적인 예입니다. 우리는 더 이상 "표현식을 평가하는"것이 아니라 "값을 조작하는 것"입니다. 우리는 여전히 ALU를 사용하지만 매개 변수를 대체 할 수있는 결과로 값을 옮기지 마십시오. 더 복잡한 표현이 필요한 경우에는 이러한 종류의 명령을 사용할 수 없습니다 . 더 많은 시간이 필요 i = 3*i + i-2하므로 제자리에서 조작 할 수 없습니다 i.

세 번째-더 간단한 방법은 "추가"라는 개념을 고려하지 않고 카운터에 대해 더 "기본적"(계산적 의미) 회로를 사용합니다. 조합 네트워크가 카운터를 작게 만들기 위해 레지스터를 개조해야하므로 풀 가산기보다 빠르기 때문에 명령이 짧아지고 빠르게로드되며 즉시 실행됩니다.

현대의 컴파일러 (현재 C 참조)에서 컴파일러 최적화를 가능하게하면 편의성에 따라 해당 내용을 교체 할 수 있지만 의미에는 여전히 개념적 차이가 있습니다.

x += 5 방법

  • x로 식별되는 장소 찾기
  • 그것에 5를 더하십시오

그러나 다음을 x = x + 5의미합니다.

  • x + 5를 평가하십시오
    • x로 식별되는 장소 찾기
    • x를 누산기에 복사
    • 누산기에 5 추가
  • 결과를 x에 저장
    • x로 식별되는 장소 찾기
    • 누산기 복사

물론 최적화는

  • "찾기 x"에 부작용이없는 경우 두 "찾기"를 한 번 수행 할 수 있습니다 (x는 포인터 레지스터에 저장된 주소가 됨)
  • ADD가 &x대신 어큐뮬레이터에 적용되면 두 복사본을 제거 할 수 있습니다.

따라서 최적화 된 코드가 일치하도록 x += 5만듭니다.

그러나 "finding x"에 부작용이없는 경우에만 수행 할 수 있습니다.

*(x()) = *(x()) + 5;

*(x()) += 5;

x()부작용 (admting x()은 이상한 일을하고을 반환하는 함수 int*)이 두 번 또는 한 번 생성 되므로 의미 적으로 다릅니다 .

간의 등가 x = x + yx += y인하여 특별한 경우에 따라서 인 +==직접 L 값에 적용된다.

파이썬으로 옮기기 위해 C에서 구문을 상속했지만 해석 된 언어로 실행하기 전에 번역 / 최적화가 없기 때문에 일이 밀접하게 관련되어 있지는 않습니다 (파싱 단계가 적기 때문에). 그러나 인터프리터는 세 가지 유형의 식에 대해 서로 다른 실행 루틴을 참조 할 수 있으며 식의 형성 방식과 평가 컨텍스트에 따라 다른 기계 코드를 활용합니다.


더 자세한 정보를 좋아하는 사람은 ...

모든 CPU에는 본질적으로 명령의 opcode에 따라 입력 및 출력이 레지스터 및 / 또는 메모리에 "플러그 된"조합 네트워크 인 ALU (산술 논리 단위)가 있습니다.

이진 연산은 일반적으로 "어딘가에 입력이있는 어큐뮬레이터 레지스터의 수정 자로 구현됩니다. 여기서 어딘가에-명령 흐름 자체 내부 (표현 적 상수에 대해서는 ADD A 5)-다른 레지스트리 내부 (일반적으로 식 계산에 사용) 임시 : 예 : ADD AB)-메모리 내부, 레지스터에 의해 주어진 주소 (일반적으로 데이터 페칭 예 : ADD A (H))-H,이 경우 역 참조 포인터처럼 작동합니다.

이 의사로, x += 5이다

ADD (X) 5

반면이 x = x+5있다

MOVE A (X)
ADD A 5
MOVE (X) A

즉, x + 5는 나중에 할당 된 임시를 제공합니다. x += 5x에서 직접 작동합니다.

실제 구현은 프로세서의 실제 명령어 세트에 따라 다릅니다. ADD (.) copcode 가 없으면 첫 번째 코드가 두 번째 코드가됩니다.

이러한 opcode가 있고 최적화가 활성화 된 경우 두 번째 표현식은 역 이동을 제거하고 레지스터 opcode를 조정 한 후 첫 번째 표현식이됩니다.


90
예전에는 다른 (보다 효율적인) 머신 코드에 매핑하는 데 사용한 유일한 대답에 +1했습니다.
Péter Török

11
@KeithThompson 사실이지만, 어셈블리가 C 언어 (및 모든 C 스타일 언어)의 디자인에 큰 영향을 미쳤다는 것을 부인할 수는 없습니다.
MattDavey

51
음, "+ ="는 "inc"( "add"에 매핑)에 매핑되지 않습니다. "++"는 "inc"에 매핑됩니다.
Brendan

11
"20 년 전"은 "30 년 전"을 의미한다고 생각합니다. 그리고 BTW, COBOL은 다음 20 년 동안 C를
뛰었

10
이론적으로는 훌륭합니다. 사실 틀렸다. x86 ASM INC는 1 만 추가하므로 여기에 설명 된 "추가 및 할당"연산자에는 영향을 미치지 않습니다 (이것은 "++"및 "-"에 대한 훌륭한 답변입니다).
Mark Brackett

281

어떻게 생각 하느냐에 따라 실제로 이해하기가 더 쉽습니다. 예를 들면 다음과 같습니다.

x = x + 5 "x를 취하여 5를 더한 다음 x에 새로운 값을 다시 할당합니다"라는 정신적 처리를 호출합니다.

x += 5 "x x 5 증가"로 생각할 수 있습니다

따라서 그것은 단지 속기 만이 아니라 실제로 기능을 훨씬 더 직접적으로 설명합니다. 코드 덩어리를 읽을 때 훨씬 쉽게 이해할 수 있습니다.


32
+1, 전적으로 동의합니다. 내 마음이 쉽게 변하기 쉬우면서도 x = x + 5여전히 어려움을 겪었을 때 나는 어린 시절부터 프로그래밍을 시작했다 . 나중에 수학에 들어갔을 때, 그것은 더욱 귀찮았습니다. 사용 x += 5은 훨씬 더 설명적이고 표현으로 훨씬 더 의미가 있습니다.
다항식

44
변수의 이름이 긴 경우도 있습니다. reallyreallyreallylongvariablename = reallyreallyreallylongvariablename + 1... oh noes !!! 오타

9
@ 매트 펜윅 : 긴 변수 이름 일 필요는 없습니다. 그것은 일종의 표현 일 수 있습니다. 그것들은 검증하기가 더 어려울 수 있으며 독자는 동일한 지 확인하기 위해 많은주의를 기울여야합니다.
David Thornley

32
X = X + 5는 당신의 목표가 x를 5 씩 증가시키는 것입니다.
JeffO

1
@Polynomial 나는 또한 어린 시절 x = x + 5의 개념을 발견했다고 생각합니다. 내가 정확하게 기억한다면 9 살입니다. 그리고 그것은 나에게 완벽한 의미를 지니고 있으며 지금도 나에게 완벽한 의미를 가지고 있으며 x + = 5를 선호합니다. 첫 번째는 훨씬 더 장황하며 개념을 훨씬 더 명확하게 상상할 수 있습니다- x를 x의 이전 값 (그것이 무엇이든)으로 할당하고 5를 더한다는 생각은 다른 두뇌가 다른 방식으로 작동한다고 생각합니다.
Chris Harrison

48

적어도 파이썬 , x += y그리고 x = x + y완전히 다른 일을 할 수있다.

예를 들어

a = []
b = a

다음 a += [3]에 발생합니다 a == b == [3]동안 a = a + [3]발생합니다 a == [3]b == []. 즉, +=객체를 제자리에서 수정하고 (물론 원하는 __iadd__방식으로 메서드를 정의 할 수 있음 ) =새 객체 를 만들고 변수를 바인딩합니다.

배열의 다른 부분에 대한 여러 참조로 자주 끝나므로 NumPy로 수치 작업을 수행 할 때 매우 중요 하며 다른 참조가있는 배열의 일부를 실수로 수정하지 않아야합니다. 또는 배열을 불필요하게 복사합니다 (매우 비쌀 수 있음).


4
+1 for __iadd__: 가변 데이터 구조에 대한 불변 참조를 생성 할 수있는 언어가 있습니다 ( operator +=예 : scala : val sb = StringBuffer(); lb += "mutable structure"vs) var s = ""; s += "mutable variable". 후자는 데이터 구조의 내용을 추가로 수정하는 반면 후자는 변수를 새로운 것을 가리킨다.
날으는 양

43

관용구 라고합니다 . 프로그래밍 관용구는 특정 프로그래밍 구조를 작성하는 일관된 방식이므로 유용합니다.

누군가가 x += y당신을 쓸 때마다 더 복잡한 작업 x이 아니라 증가하고 있음을 알 수 y있습니다 (가장 좋은 방법으로 일반적으로 더 복잡한 작업과 이러한 구문 속기를 혼합하지는 않습니다). 이것은 1 씩 증가 할 때 가장 적합합니다.


13
x ++와 ++ x는 x + = 1과 서로 약간 다릅니다.
Gary Willoughby

1
@Gary : ++xx+=1C와 자바 (아마도 또한 C #을)에서 동일 반드시 그렇게 C ++에서 때문에이 복잡한 운영자 의미의 생각. 핵심은 두 x번 모두 평가 하고 변수를 1 씩 증가시키고 평가 후 변수의 내용 인 결과 를 얻는 것입니다.
Donal Fellows

3
@Donal Fellows : 우선 순위가 다르므로 ++x + 3와 동일하지 않습니다 x += 1 + 3. 괄호 안에는 x += 1동일합니다. 그 자체로 진술로서, 그들은 동일합니다.
David Thornley 2012

1
@DavidThornley : 그것은 :) 둘 다 정의되지 않은 동작이있을 때 "그들이 동일한있어 '라고하기 어렵다
궤도의 밝기 경주

1
표현식 없음 ++x + 3, x += 1 + 3또는 (x += 1) + 3(결과 값 "발작"을 가정) 동작을 정의되지 않은.
존 Hascall

42

@Pubby의 요점을 좀 더 명확하게하려면 someObj.foo.bar.func(x, y, z).baz += 5

+=운영자가 없으면 두 가지 방법이 있습니다.

  1. someObj.foo.bar.func(x, y, z).baz = someObj.foo.bar.func(x, y, z).baz + 5. 이것은 끔찍하게 중복되고 길뿐만 아니라 느리다. 그러므로 우리는
  2. 임시 변수를 사용하십시오 tmp := someObj.foo.bar.func(x, y, z); tmp.baz = tmp.bar + 5. 이것은 괜찮지 만 간단한 일에는 많은 소음이 있습니다. 이것은 실제로 런타임에 일어나는 것과 거의 비슷하지만 작성하고 지루하게 +=하면 작업이 컴파일러 / 인터프리터로 이동합니다.

+=이러한 연산자 의 장점 과 다른 연산자는 부인할 수 없지만 익숙해지는 것은 시간 문제 일뿐입니다.


객체 체인에 3 단계 깊이 들어가면 1과 같은 작은 최적화와 2와 같은 시끄러운 코드에 대한 관심을 멈출 수 있습니다. 대신 디자인을 한 번 더 생각해보십시오.
Dorus

4
@Dorus : 내가 선택한 표현은 "복잡한 표현"을 나타내는 임의의 표현 일뿐입니다. ) 당신은 습관에 대해 nitpick 것을, 당신의 머리에 뭔가로 대체 자유롭게
back2dos

9
+1 : 이것이이 최적화의 주된 이유 입니다. 좌변의 표현이 아무리 복잡하더라도 항상 정확합니다.
S.Lott

9
거기에 오타를 넣는 것은 일어날 수있는 일의 좋은 예입니다.
David Thornley

21

더 짧고 쉽다는 것이 사실이며 아마도 기본 어셈블리 언어에서 영감을 얻은 것이 사실이지만, 가장 좋은 방법 은 전체 클래스의 오류를 방지하고 코드를 검토하고 더 쉽게 확인할 수 있기 때문입니다. 그것이하는 일.

RidiculouslyComplexName += 1;

하나의 변수 이름 만 관련되므로 명령문의 기능이 확실합니다.

RidiculouslyComplexName = RidiculosulyComplexName + 1;

양측이 정확히 같은지 항상 의심의 여지가 있습니다. 당신은 버그를 보았습니까? 아래 첨자와 한정자가 있으면 더 나빠집니다.


5
대 입문이 암시 적으로 변수를 생성 할 수있는 언어, 특히 언어가 대소 문자를 구분하는 경우에는 더 나빠집니다.
supercat 2016 년

14

+ = 표기법은 관용적이고 짧지 만, 읽기 쉬운 이유는 아닙니다. 코드를 읽는 데있어 가장 중요한 부분은 구문을 의미에 매핑하는 것이므로 구문이 프로그래머의 사고 프로세스와 더 가까울수록 더 읽기 쉽습니다 (이것은 상용구 코드가 나쁜 이유이기도합니다. 프로세스, 그러나 여전히 코드 기능을 수행하는 데 필요합니다). 이 경우, 생각은 "x를 5에 5를 더한 값으로하자"가 아니라 "변수 x를 5 씩 증가시키는 것"입니다.

if문장이 더 적합한 삼항 연산자를 사용할 때와 같이 짧은 표기법이 가독성에 좋지 않은 경우도 있습니다 .


11

이러한 연산자가 'C 스타일'언어로 시작하는 이유에 대한 통찰력을 얻으려면 34 년 전 K & R 1st Edition (1978) 에서 발췌 한 내용이 있습니다 .

간결함과는 별도로 할당 담당자는 사람들이 생각하는 방식에 더 잘 부합한다는 이점이 있습니다. "i에 2를 더한다"또는 "2를 더한 다음 2를 더한 다음 결과를 다시 i에 넣지 말고"가 아니라 "2에 i를 더한다"라고 말합니다. 따라서 i += 2. 또한 복잡한 표현을 위해

yyval[yypv[p3+p4] + yypv[p1+p2]] += 2

대입 연산자는 독자가 두 개의 긴 표현이 실제로 동일한 지 또는 힘들지 않은지 궁금해 할 필요가 없기 때문에 코드를 이해하기 쉽게 만듭니다. 할당 연산자는 컴파일러가보다 효율적인 코드를 생성하도록 도와 줄 수도 있습니다.

이 구절에서 Brian KernighanDennis Ritchie (K & R)는 복합 할당 연산자가 코드 가독성에 도움이된다고 믿었다는 것이 분명하다고 생각합니다 .

K & R이 저술 한 지 오래되었고, 사람들이 코드를 작성하는 방법에 대한 많은 '우수 사례'가 그 이후로 바뀌거나 발전해 왔습니다. 그러나이 programmers.stackexchange 질문은 복합 할당의 가독성에 대한 불만을 표명하는 누군가를 회상 할 수있는 첫 번째 시간이므로 많은 프로그래머가 문제가 있다고 생각합니까? 그런 다음 다시 입력하면 질문에 95 개의 공감대가 있으므로 사람들은 코드를 읽을 때 문제가 발생할 수 있습니다.


9

가독성 외에도 실제로 다른 작업을 수행 +=합니다. 왼쪽 피연산자를 두 번 평가할 필요가 없습니다.

예를 들어, 두 번 expr = expr + 5증발합니다 expr( 정확 expr하지 않은 것으로 가정 ).


가장 이상한 컴파일러를 제외하고는 중요하지 않습니다. 대부분의 컴파일러는 동일한 바이너리를 생성 할만큼 똑똑 expr = expr + 5하고expr += 5
VSZ

7
@vsz expr부작용이 없다면 아닙니다 .
Pubby

6
@vsz : C에서 expr부작용이있는 경우 해당 부작용을 두 번 호출 expr = expr + 5 해야합니다 .
Keith Thompson

@Pubby : 부작용이있는 경우 "편의성"과 "가독성"에 대한 문제는 없습니다. 이는 원래 질문의 핵심이었습니다.
vsz

2
이러한 "부작용"문에주의를 기울이는 것이 좋습니다. 읽고 쓸 때 volatile부작용이며 x=x+5, x+=5있을 때와 동일한 부작용 x이 있습니다volatile
MSalters

6

다른 사람들이 잘 묘사 한 명백한 장점 외에도 이름이 매우 길면 더 컴팩트합니다.

  MyVeryVeryVeryVeryVeryLongName += 1;

또는

  MyVeryVeryVeryVeryVeryLongName =  MyVeryVeryVeryVeryVeryLongName + 1;

6

간결합니다.

입력하기가 훨씬 짧습니다. 더 적은 운영자가 필요합니다. 표면적이 적고 혼란의 기회가 적습니다.

보다 구체적인 연산자를 사용합니다.

이것은 고안된 예이며 실제 컴파일러가 이것을 구현하는지 확실하지 않습니다. x + = y는 실제로 하나의 인수와 하나의 연산자를 사용하고 x를 수정합니다. x = x + y는 x = z의 중간 표현을 가질 수 있습니다. 여기서 z는 x + y입니다. 후자는 두 개의 연산자, 더하기와 대입, 임시 변수를 사용합니다. 단일 연산자를 사용하면 값 측면이 y 이외의 값이 될 수 없으며 해석 할 필요가 없음을 매우 명확하게합니다. 이론적으로 더하기 연산자와 할당 연산자보다 빠르게 실행되는 더하기 연산자가있는 멋진 CPU가있을 수 있습니다.


2
이론적으로 체계적으로. ADD많은 CPU 의 명령어에는 다른 레지스터, 메모리 또는 상수를 두 번째 추가 항목으로 사용하여 레지스터 나 메모리에서 직접 작동하는 변형이 있습니다. 모든 조합을 사용할 수있는 것은 아니지만 (예 : 메모리를 메모리에 추가) 유용 할 수 있습니다. 어쨌든, 괜찮은 최적화 어떤 컴파일러는 동일한 코드를 생성하는 알 x = x + y이에 대한 것 등 x += y.
Blrfl

그러므로 "고려되었다".
Mark Canlas

5

좋은 관용구입니다. 더 빠른지 아닌지는 언어에 달려 있습니다. C에서는 변수를 오른쪽으로 늘리라는 명령으로 변환되므로 속도가 빠릅니다. Python, Ruby, C, C ++ 및 Java를 포함한 최신 언어는 모두 op = 구문을 지원합니다. 컴팩트하고 빠르게 익숙해집니다. 다른 사람들의 코드 (OPC)에서 많이 볼 수 있기 때문에 익숙해 져 사용할 수도 있습니다. 몇 가지 다른 언어로 발생하는 상황은 다음과 같습니다.

파이썬에서 입력 x += 5하면 여전히 정수 객체 1이 만들어 지지만 (풀에서 가져올 수는 있지만) 5를 포함하는 정수 객체의 고아가 발생합니다.

Java에서는 암묵적 캐스트가 발생합니다. 입력 해보십시오

int x = 4;
x = x + 5.2  // This causes a compiler error
x += 5.2     // This is not an error; an implicit cast is done.

현대적인 명령형 언어. (순수한) 기능적 언어 x+=5x=x+5; 하스켈 예를 들어, 후자는 않는다 하지 원인 x(5)에 의해 증가 될 - 대신 무한 순환 루프를 초래한다. 누가 속기를 원할까요?
leftaroundabout

최신 컴파일러에서는 전혀 빠르지는 않습니다. 심지어 C에서도 마찬가지입니다.
HörmannHH

속도 +=프로세서에 따라 다르기 때문에 언어에 의존하지 않습니다 . 예를 들어 X86은 두 주소 아키텍처이며 +=기본적으로 만 지원합니다 . 덧셈의 ​​결과를 소환사 중 하나의 장소에 넣을 수있는 명령이 없기 때문에 이와 같은 문장을 a = b + c;컴파일해야합니다 a = b; a += c;. 이와 반대로 전력 아키텍처는에 대한 특별한 명령이없는 3 주소 아키텍처입니다 +=. 이 아키텍처에서 문 a += b;그리고 a = a + b;항상 같은 코드를 컴파일합니다.
cmaster

4

과 같은 연산자 +=는 변수를 누산기 로 사용할 때 매우 유용합니다 ( 예 : 누계).

x += 2;
x += 5;
x -= 3;

다음보다 읽기가 훨씬 쉽습니다.

x = x + 2;
x = x + 5;
x = x - 3;

첫 번째 경우 개념적으로의 값을 수정합니다 x. 두 번째 경우에는 새로운 값을 계산하여 x매번 할당합니다 . 그리고 당신은 아마도 그렇게 간단한 코드를 작성하지는 않겠지 만, 아이디어는 동일하게 유지됩니다. 초점은 새로운 가치를 창출하는 대신 기존 가치에 대해하고 있습니다.


나를 위해 그것은 반대입니다. 첫 번째 변형은 화면의 먼지와 같고 두 번째 변형은 깨끗하고 읽을 수 있습니다.
Mikhail V

1
@MikhailV, 다른 사람들을위한 다른 뇌졸중이지만 프로그래밍에 익숙하지 않으면 잠시 후에 시야가 바뀔 수 있습니다.
Caleb

나는 프로그래밍에 익숙하지 않다. 오랫 동안 단순히 + = 표기법에 익숙해 져서 읽을 수 있다고 생각한다. 처음에는 잘 보이지 않는 구문이 아니므로 공백으로 둘러싸인 + 연산자는 + =와 친구가 거의 구별 할 수없는 객관적으로 깨끗합니다. 당신의 대답이 부정확하지는 않지만, "읽기 쉬운"방법을 소비하는 습관에 너무 의존해서는 안됩니다.
Mikhail V

내 생각은 표현을 더 콤팩트하게 만드는 것보다 새로운 가치를 축적하고 저장하는 것의 개념적 차이에 관한 것입니다. 대부분의 명령형 프로그래밍 언어에는 비슷한 연산자가 있으므로 유용하다고 생각하는 유일한 사람은 아닙니다. 그러나 내가 말했듯이, 사람들마다 다른 뇌졸중. 마음에 들지 않으면 사용하지 마십시오. 토론을 계속하려면 Software Engineering Chat 이 더 적합 할 것입니다.
Caleb

1

이걸 고려하세요

(some_object[index])->some_other_object[more] += 5

D0 정말 쓰고 싶어

(some_object[index])->some_other_object[more] = (some_object[index])->some_other_object[more] + 5

1

다른 답변은 더 일반적인 경우를 대상으로하지만 다른 이유가 있습니다. 일부 프로그래밍 언어에서는 오버로드 될 수 있습니다. 예를 들어 스칼라 .


작은 스칼라 레슨 :

var j = 5 #Creates a variable
j += 4    #Compiles

val i = 5 #Creates a constant
i += 4    #Doesn’t compile

클래스가 +연산자 만 정의하면 x+=y실제로 바로 가기입니다 x=x+y.

+=그러나 클래스가 오버로드 되면 다음이 아닙니다.

var a = ""
a += "This works. a now points to a new String."

val b = ""
b += "This doesn’t compile, as b cannot be reassigned."

val c = StringBuffer() #implements +=
c += "This works, as StringBuffer implements “+=(c: String)”."

또한, 운영자 ++=(A, ++ A, ++ +, A + B = BA + 다른 운영자 역시되며 단지 이러한) 두 개의 연산자는 연산자 오버로딩이 가능한 언어에서는 흥미로운 상황이 발생할 수 있습니다. 위에서 설명한 것처럼- +추가를 수행하기 위해 연산자에 +=과부하가 걸리는 경우 과부하가 발생해야합니다.


"클래스가 + 연산자 만 정의하면 x + = y는 실제로 x = x + y의 바로 가기입니다." 그러나 분명히 다른 방법으로 작동합니까? C ++에서 먼저 정의하는 것은 매우 흔한 일 +=다음 정의 a+b"의 사본 만들기로 a넣어 b사용하여에을 +=의 사본을 반환 a".
leftaroundabout

1

한 번만 말하십시오 :에서 x = x + 1'x'는 두 번 말합니다.

그러나 'a = b + = 1'이라고 쓰지 마십시오. 그렇지 않으면 새끼 고양이 10 마리, 생쥐 27 마리, 개, 햄스터를 죽여야합니다.


코드의 정확성을 쉽게 증명할 수 있도록 변수의 값을 변경해서는 안됩니다. 함수형 프로그래밍을 참조하십시오. 그러나 그렇게하면 한 번만 말하지 않는 것이 좋습니다.


"변수의 값을 변경하지 마십시오" 기능적 패러다임 ?
피터 Mortensen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.