i + + 와 + i 연구
직접 코드 올 리 기:
1.++i
int add(int a, int b)
{
int c = 0;
b = ++c;
return a+b;
}
int init()
{
int a = add(3, 4);
return a;
}
대응 하 는 어 셈 블 리 는 다음 과 같다.
_Z3addii:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $16, %esp
movl $0, -8(%ebp)
addl $1, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
movl 8(%ebp), %edx
addl %edx, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size _Z3addii, .-_Z3addii
.globl _Z4initv
.type _Z4initv, @function
다음 몇 마디 를 중점적으로 분석 하 자.
movl $0, -8(%ebp) ;이 문장 은 c = 0 addl $1, - 8 (% ebp) 을 나타 낸다.이 문장 은 + + c movl - 8 (% ebp),% eax 를 나타 낸다.이 문장 은 c 가 추가 한 값 을 임시 레지스터 에 movl% eax, - 4 (% ebp) 로 저장 합 니 다.이 문장 은 c 가 추 가 된 값 을 b 에 게 부여 하 는 것 을 나타 낸다
2.i++
int add(int a, int b)
{
int c = 0;
b = c++;
return a+b;
}
int init()
{
int a = add(3, 4);
return a;
}
대응 하 는 어 셈 블 리 는 다음 과 같다.
_Z3addii:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $16, %esp
movl $0, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, -4(%ebp)
addl $1, -8(%ebp)
movl -4(%ebp), %eax
movl 8(%ebp), %edx
addl %edx, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size _Z3addii, .-_Z3addii
.globl _Z4initv
.type _Z4initv, @function
다음 몇 마디 를 중점적으로 보 세 요.
movl $0, -8(%ebp) ;이 문장 은 c = 0 movl - 8 (% ebp),% eax 를 나타 낸다.이 문장 은 c 의 값 을 임시 레지스터 에 movl% eax, - 4 (% ebp) 로 표시 합 니 다.이 문장 은 c 가 추가 되 지 않 은 값 을 b addl $1, - 8 (% ebp) 에 부여 하 는 것 을 나타 낸다.이 문장 은 c 의 값 을 1 로 더 하 는 것 을 나타 낸다.
결론: + + i 는 먼저 추가 한 다음 에 추가 한 값 을 사용 하고 i + + 는 원래 의 값 을 먼저 사용 한 다음 에 추가 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.