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.1709 sec