E D R , A S I H C RSS

i++VS++i

C/C++ —„œ ++i ™€ i++ ˜ „ฑŠฅ ฐจ— Œ€•œ น„๊ต

  • ‚ฌšฉ•œ ŒŒผŸฌ : Microsoft 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 (Microsoft Visual C++ 6.0 — Service Pack 5 ฅผ „คน˜–ˆ„•Œ˜ ŒŒผŸฌ)




1. ๊ทธƒ‚ฌšฉ

  • น„๊ต•œ C/C++ †ŒŠค

~cpp 
#include <stdio.h>
void main()
{
	int i;
	scanf("%d", &i);
	++i;
	printf("%d", i);
}
~cpp 
#include <stdio.h>
void main()
{
	int i;
	scanf("%d", &i);
	i++;    //  ‡๊ฒŒ •˜ ฐจ๊ฐ€ ‹น—ฐžˆ —†€ •Š„๊นŒš”? Ÿ•ŒŠ” „ –‰“  ›„–‰“  ฆ๊ฐ€•œ’ค— printf—„œ ๊ทธ €ˆ˜ฅผ ‚ฌšฉ–ˆœผ‹ˆ..
	printf("%d", i);     // ฌธ œ๊ฐ€ ˜Š”๊ฑ •ˆ˜(i++)˜Š” •ˆ˜(++i)Ÿฐฐ—„œ ฌธ œ๊ฐ€ ƒ๊ธธ๊ฑฐ ๊ฐ™€ฐ..
}
๊ฐ„‹จžˆ ƒ๊ฐ•˜ ˜Š” ๊ฒƒ—ˆŠต‹ˆ‹ค.. i++ ‚˜ ++i ‘ ๊ฐ’(value)„ ƒ„ฑ•˜Š” —ฐ‚ฐž ž…‹ˆ‹ค. ๊ทธŸฌ€กœ.. i ๊ฐ€ 5 ผ•Œ i++ ˜ ๊ฐ’€ 5€กœ.. printf("%d", i) Š” 5ฅผ ฐ–ฃผ๊ฒ €š”.

1.1. ตœ ™”•˜€ •Š„•Œ

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	ecx, DWORD PTR _i$[ebp]	; €ˆ˜ i ธ _i$[ebp] ฅผ ecx กœ ˜ฎ๊ธฐ๊ณ 
    	add	ecx, 1			; ecx — 1 „ ”•˜๊ณ 
    	mov	DWORD PTR _i$[ebp], ecx	; ecx ฅผ ‹ค‹œ _i$[ebp] กœ
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	ecx, DWORD PTR _i$[ebp]	; ฐจ —†Œ
    	add	ecx, 1
    	mov	DWORD PTR _i$[ebp], ecx
    

1.2. ฌ๊ธฐ ตœ ™”

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	inc	DWORD PTR _i$[ebp]		; €ˆ˜ i ธ _i$[ebp] ฅผ 1 งŒผ ฆ๊ฐ€‹œ‚
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	inc	DWORD PTR _i$[ebp]		; ฐจ —†Œ
    

1.3. †„ ตœ ™”

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	eax, DWORD PTR _i$[esp+12]	; €ˆ˜ i ธ _i$[esp+12] ฅผ eax กœ ˜ฎ๊ธฐ๊ณ 
    	inc	eax			; eax ฅผ 1 งŒผ ฆ๊ฐ€‹œ‚
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	eax, DWORD PTR _i$[esp+12]	; ฐจ —†Œ
    	inc	eax
    


2. for ฌธ—„œ ‚ฌšฉ

  • น„๊ต•œ C/C++ †ŒŠค

~cpp 
#include <stdio.h>
void main()
{
	for(int i = 0 ; i < 10 ; ++i)
		printf("%d", i);
}
~cpp 
#include <stdio.h>
void main()
{
	for(int i = 0 ; i < 10 ; i++)
		printf("%d", i);
}

2.1. ตœ ™”•˜€ •Š„•Œ

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	eax, DWORD PTR _i$[ebp]	; €ˆ˜ i ธ _i$[ebp] ฅผ eax กœ ˜ฎ๊ธฐ๊ณ 
    	add	eax, 1			; eax — 1 „ ”•˜๊ณ 
    	mov	DWORD PTR _i$[ebp], eax	; eax ฅผ ‹ค‹œ _i$[ebp] กœ
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	eax, DWORD PTR _i$[ebp]	; ฐจ —†Œ
    	add	eax, 1
    	mov	DWORD PTR _i$[ebp], eax
    

2.2. ฌ๊ธฐ ตœ ™”

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	inc	esi			; €ˆ˜ i ธ esi ฅผ 1 งŒผ ฆ๊ฐ€‹œ‚
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	inc	esi			; ฐจ —†Œ
    

2.3. †„ ตœ ™”

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	inc	esi			; €ˆ˜ i ธ esi ฅผ 1 งŒผ ฆ๊ฐ€‹œ‚
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	inc	esi			; ฐจ —†Œ
    


3. •ˆ˜ —„œ ‚ฌšฉ

  • น„๊ต•œ C/C++ †ŒŠค

~cpp 
#include <stdio.h>
void main()
{
	int i;
	scanf("%d", &i);
	printf("%d", ++i);
}
~cpp 
#include <stdio.h>
void main()
{
	int i;
	scanf("%d", &i);
	printf("%d", i++);
}

3.1. No ตœ ™”

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	ecx, DWORD PTR _i$[ebp]
    	add	ecx, 1
    	mov	DWORD PTR _i$[ebp], ecx
    	mov	edx, DWORD PTR _i$[ebp]
    	push	edx
    	push	OFFSET FLAT:$SG528
    	call	_printf
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	ecx, DWORD PTR _i$[ebp]
    	mov	DWORD PTR -8+[ebp], ecx
    	mov	edx, DWORD PTR -8+[ebp]
    	push	edx
    	push	OFFSET FLAT:$SG528
    	mov	eax, DWORD PTR _i$[ebp]
    	add	eax, 1
    	mov	DWORD PTR _i$[ebp], eax
    	call	_printf
    

3.2. ฌ๊ธฐ ตœ ™”

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	inc	DWORD PTR _i$[ebp]
    	push	DWORD PTR _i$[ebp]
    	push	esi
    	call	_printf
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	eax, DWORD PTR _i$[ebp]
    	inc	DWORD PTR _i$[ebp]
    	push	eax
    	push	esi
    	call	_printf
    

3.3. †„ ตœ ™”

  • ++i ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	eax, DWORD PTR _i$[esp+12]
    	inc	eax
    	push	eax
    	push	OFFSET FLAT:??_C@_02MECO@?$CFd?$AA@
    	mov	DWORD PTR _i$[esp+20], eax
    	call	_printf
    

  • i++ ˜ ŒŒผœ –…ˆธ”ฆฌ †ŒŠค
    ~cpp 
    	mov	eax, DWORD PTR _i$[esp+12]
    	mov	ecx, eax
    	inc	eax
    	push	ecx
    	push	OFFSET FLAT:??_C@_02MECO@?$CFd?$AA@
    	mov	DWORD PTR _i$[esp+20], eax
    	call	_printf
    

4. —ฐ‚ฐž žฌ •˜กœ ๊ตฌ˜„–ˆ„•Œ

class —„œ operator overloading œผกœ  „œ„ฆ๊ฐ€(๊ฐ†Œ)™€ ›„œ„ฆ๊ฐ€(๊ฐ†Œ)Š” ‹คŒ๊ณผ ๊ฐ™ ๊ตฌ˜„˜– žˆ‹ค.
~cpp 
MyInteger& MyInteger::operator++() //  „œ„ฆ๊ฐ€
{
 *this += 1;
 return *this;
}
const MyInteger MyInteger::operator++(int) // ›„œ„ฆ๊ฐ€.  „‹ฌธžกœ int ๊ฐ€ žˆ€งŒ
                                         // ŒŒผŸฌŠ” ‚€ œผกœ operator++(0)„ ˜ธถœ•œ‹ค.
{
 const MyInteger oldValue = *this;
 ++(*this);

 return oldValue;
}
 
—ฐ‚ฐž žฌ •˜ฅผ •˜—ฌ Šน • ๊ฐœ— Œ€•  „œ„ฆ๊ฐ€™€ ›„œ„ฆ๊ฐ€ฅผ ‚ฌšฉ•  •Œ—Š”  „œ„ฆ๊ฐ€๊ฐ€ ›„œ„ฆ๊ฐ€‹ค šจœจ ข‹‹ค. operator++(int) •ˆ˜—„œŠ” ž„‹œ ๊ฐฅผ ƒ„ฑ•˜Š” €ถ„ žˆ‹ค.
- from MoreEffectiveC++

4.1. STL —„œ

++i, ‚˜ i++ ‘˜‹ค ƒ๊€ —†Š” ƒ™ผ, ++i— Šต๊€„ “คž, œ„˜ —ฐ‚ฐž žฌ •˜Š” STL„ ‚ฌšฉ•œ‹ค ผฐ˜ ธ ๊ฒฝšฐ‹ค. ›„œ„ —ฐ‚ฐž๊ฐ€ ๊ตฌ˜„œ IteratorŠ” ‘ ๊ฐฅผ ณต‚ฌ•˜Š” ๊ณผ •„ ๊ฑฐนœ‹ค. ŒŒผŸฌ‹จ—„œ Iterator ˜ ณต‚ฌฅผ ตœ ™” • ˆ˜ žˆŠ” ๊ฐ€Šฅ„ฑ—„œŠ” žฅ•  ˆ˜ —†‹ค. ”ฐผ„œ, ‹คŒ๊ณผ ๊ฐ™€ ๊ฒฝšฐ
~cpp 
static const int MAX = 5;
int array[5] = {1,2,3,4,5}
vector<int> intArray(&array[0], &array[MAX]);

for(vector<int>::iterator i = intArray.begin(); i != intArray.end(); ++i){
    cout << *i << endl;
}
๊ฐ€ ๊ฐ ณต‚ฌฅผ •˜€ •ŠŠ”‹ค. ๊ฐ๊ฐ€ ฌ‹ค  น„šฉ€ ‹œ•  ˆ˜ —†‹ค. ” ๊ถ๊ธˆ•˜, STL †ŒŠคฅผ ถ„„• ž.
--NeoCoin

5. ๊ฒฐก 

๊ทธƒ‚ฌšฉ•œ ๊ฒฝšฐ‚˜, for ฌธ—„œ ‚ฌšฉ•œ ๊ฒฝšฐŠ” ++i ™€ i++ ˜ „ฑŠฅ ฐจ๊ฐ€ —†‹ค. ๊ทธŸฌ‚˜ •ˆ˜˜  „‹ฌธžกœ ‚ฌšฉ•œ ๊ฒฝšฐŠ” ++i ‹ค i++ ˜ ฝ”“œ๊ฐ€ … น– •œ๊ฐœ  •„ ๊ธธ–ง„‹ค. •˜€งŒ ๊ทธƒ‚ฌšฉ•œ ๊ฒฝšฐ‚˜ for ฌธ—„œ ‚ฌšฉ•œ ๊ฒฝšฐ—Š” i++ „ “ ๊ณณ„ ++i กœ „œกœ ฐ”๊ฟ” จ„ ƒ๊€ —†œผ‚˜, •ˆ˜˜  „‹ฌธžกœ ‚ฌšฉ•œ ๊ฒฝšฐ—Š” i++ „ “ ๊ณณ„ ++i กœ ฐ”๊พธ ‹ค–‰ ๊ฒฐ๊ณผ๊ฐ€ ‹ฌผง„‹ค. ๊ทธŸฌ€กœ •ˆ˜—„œ i++ „ ‚ฌšฉ•˜๊ณ  žˆ„ ๊ฒฝšฐ ”„กœ๊ทธžจ •œ ค„ ผ„ ถ”๊ฐ€˜€ •Š๊ณ  ++i กœ ฐ”๊ฟ€ˆ˜ žˆœผ ฐ”๊พธŠ” ๊ฒƒ ” šจœจ ‹ค. ˜•œ ๊ทธƒ‚ฌšฉ•  ๊ฒฝšฐ‚˜, for ฌธ—„œ ‚ฌšฉ•œ ๊ฒฝšฐŠ” ++i ฅผ “ฐ€ •Š•„„ ƒ๊€ —†‹ค. --ƒ๊ทœ

6. † ก 

  • •„•…... –…ˆ‹ค.  „ „ ๊ฒ œผ‹ˆ ๊ฑ  œ๊ฐ€ ณธ ๊ธ€๊ท€ฅผ ๊ทธŒ€กœ ธšฉ•˜๊ฒ Šต‹ˆ‹ค.

~cpp 
—ฌ๊ธฐ—„œ ๊ต๊ณผ„œ ธ •ผ๊ธฐฅผ •˜‚˜ •˜๊ณ  „˜–๊ฐ€••  ๊ฒƒ ๊ฐ™‹ค. ฃจ”„ •ˆ—„œ •ƒ „ –‰ ฆ๊ฐ€ฅผ ‚ฌšฉ•˜Š” ๊ฒƒ ข‹€ œ Š” —‡ผ๊นŒ?

šจœจ„ฑ •ŒฌธผŠ” ๊ฒƒ  •‹ต‹ค. ›„–‰ ฆ๊ฐ€ —ฐ‚ฐžŠ” €ˆ˜˜  „ ๊ฐ’„ Œ ค ฃผ€กœ  „ ๊ฐ’„ ‹„ ž„‹œ ธ €ˆ˜ฅผ งŒ“ค๊ณ  ŒŒ๊•˜Š” ๊ณผ • ผ–‚˜๊ฒŒ œ‹ค. 
›„–‰ ฆ๊ฐ€กœ„ „ –‰ ฆ๊ฐ€™€ ™ผ•œ ฐฉ‹˜ ฃจ”„ฅผ งŒ“œŠ” ๊ฒƒ ๊ฐ€Šฅ•˜€งŒ, ›„–‰ ฆ๊ฐ€ฅผ ‚ฌšฉ•  Šนณ„•œ œ ๊ฐ€ —†‹ค •ƒ „ –‰ ฆ๊ฐ€ ˜Š” „ –‰ ๊ฐ†Œ —ฐ‚ฐžฅผ 
‚ฌšฉ•˜Š” ๊ฒƒ ฐ”žŒงžˆ‹ค.
š”ฆ˜ ŒŒผŸฌ“ค€ ตœ ™”๊ฐ€ ž˜ ˜–„œ  „ ๊ฐ’„ Œ คฃผ๊ธฐœ„•  „ ๊ฐ’„ ‹„ ž„‹œ €ˆ˜ฅผ งŒ“ค๊ณ  ๊ฐ’„ ฆ๊ฐ€‹œ‚จ ›„ ž„‹œ €ˆ˜— žˆŠ”  „ ๊ฐ’„ Œ คฃผ๊ณ  ž„‹œ €ˆ˜ฅผ ŒŒ๊•˜Š” ฐฉ‹œผกœ •˜€ •Š๊ณ ,  „ ๊ฐ’„ จผ € Œ คฃผ๊ณ  ๊ฐ’„ ฆ๊ฐ€‹œ‚ต‹ˆ‹ค.

†„๊ฐ€ •„ฃผ นจผ••˜Š” ”„กœ๊ทธž˜ฐ„ •  •ŒŠ” Šน • ŒŒผŸฌ—„œ ––๊ฒŒ •  •Œ๊ฐ€ „ฑŠฅ ” ข‹€€ •Œ •„š”๊ฐ€ žˆ„ˆ˜„ žˆ‹ค.
ฌผก  Šน • ŒŒผŸฌผŠ” ๊ฒƒ –ธ œ‚˜ …‹œ˜–••œ‹ค. ผฐ˜™”Š” ผฐ˜ œผกœ ˜ณ€ •Š‹ค.

ฉ..  €Š” ณ„กœ ‹ ๊ฒฝ“ฐ€ •ŠŠ”ฐš”... (๊ฐ๊ฐ•˜‹คŠ”;;;) Amdahl's Law ˜€‚˜.. ”„กœ๊ทธžจ †„ฅผ ฆ๊ฐ€‹œ‚ค ค,  œผ ‹œ๊ฐ„„ งŽ žก•„จนŠ” €ถ„„ ˆ˜ ••˜ผ๊ณ ... ฉ.. งˆฌกœ ”„กœ๊ทธžจ‚˜. ฆฌ–ผƒ€ž„ –”Œฆฌ€…˜๊ฐ™€๊ณณ—„œŠ” •„𔕠ˆ˜„ žˆ๊ฒ ๊ตฐš”.; - ž„ธƒ

7. ++i ฐฌ„ฑ

™ผ•œ ๊ธฐŠฅ— “‹ค, ++i — Šต๊€„ “คŠ” ๊ฒƒ„ ถ”ฒœ•œ‹ค. STL๊ฐ™€ —ฐ‚ฐž žฌ •˜ ผธŒŸฌฆฌ •Œฌธ --NeoCoin

8. i++ ฐฌ„ฑ

i++€ ๊ทธ Šนœ ˜ ๊ธฐŠฅ •„𔕠 •ŒงŒ “ฐŠ”๊ฒƒ ข‹„๊ฒƒ ๊ฐ™‹ค. i++ฅผ “ฐ ‹คŒ๊ณผ ๊ฐ™ ‘ค„ •œค„กœ ฃผŠ” ๊ฒฝšฐ๊ฐ€ žˆ๊ธฐ •Œฌธ‹ค.

˜„žฌ žฃŒฅผ ฐ๊ณ , ‹คŒ žฃŒกœ šŒ…„ •˜ ค •œ‹ค.

~cpp 
...
cout << data[i] << endl
i += 1;
...
๊ฐ€  ‡๊ฒŒ •œค„กœ ฃผŠ” ›„œ„ —ฐ‚ฐž˜ ๊ธฐŠฅ„ šฉ• •Œ “ฐž.

~cpp 
cout << data[i++] << endl;
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:42
Processing time 0.0389 sec