확장된 문법에는 범위 한정 for 나, for_each 가 있지만,


흔히 단순히 카운트를 다루는데 있어서 100개를 차례로 접근하기 위해

0 ~ 99 를 원한다든지, 99 ~ 0 을 원하는 경우를 간편하게 해 보았습니다.


//------------------------------------------------------------------------------


#define countof( arr )          sizeof arr / sizeof *arr )

#define lastfrom0( count )      int( count - 1 )


#define _abs_sub( v )           ( abs( v ) - v )

#define _abs_add( v )           ( abs( v ) + v )


// delta 나 count 어느쪽이 상수가 들어오든 상수끼리 결합, 최적화 되도록 / 2 를 가운데에 배치

#define _min_from(delta, count) ( _abs_sub(delta) / 2 * lastfrom0(count) )

#define _min_to(delta, count)   _abs_add(delta) / 2 * lastfrom0(count) )

#define _max_from(delta, count) _min_to(delta, count)

#define _max_to(delta, count)   _min_from(delta, count)


#define for_max( it, top, count, delta )

    forauto it = top - _max_from(delta, count),

          it_end = top - _max_to(delta, count) + delta;

        it != it_end; it += delta ) // 최적화 ok


// 초기화와 선언의 독립처리를 위함. 최적화 되어 사라질 if문

#define for_max_( it, top, count, delta )

                if( it     = top - _max_from(delta, count), true )  

    forconst auto it_end = top - _max_to(delta, count) + delta;

        it != it_end; it += delta ) // 최적화 ok


#define for_min( it, base, count, delta )

    forauto it _min_from(delta, count) + base,

          it_end = _min_to(delta, count) + delta + base;

        it != it_end; it += delta ) // 최적화 ok


// 초기화와 선언의 독립처리를 위함. 최적화 되어 사라질 if문

#define for_min_( it, base, count, delta )

                if( it     _min_from(delta, count) + base, true )

    forconst auto it_end = _min_to(delta, count) + delta + base;

        it != it_end; it += delta ) // 최적화 ok


#define for0(it, count, delta)  for_min( it, 0, count, delta )

#define for0_(it, count, delta) for_min_( it, 0, count, delta )

#define forward_array(it, arr)  for0( it, countof( arr ),  1 )

#define backward_array(it, arr) for0( it, countof( arr ), -1 )


//------------------------------------------------------------------------------


int     main()

{

    int a[] = { 1, 2, 3, 4, 5 };


    // i 는 0을 최솟값으로 배열 a의 갯수만큼 1씩 증가하는 iterator

    for0( i, countof( a ), 1 )

        cout << i << endl;

    cout << endl;


    // i 는 for문 밖에서 선언된, 0을 최솟값으로 배열 a의 갯수만큼 1씩 감소하는 iterator

    int i;

    for0_( i, countof( a ), -1 )

        cout << i << endl;

    cout << endl;


    // i 는 배열 a 의 첫 요소부터 마지막 요소까지의 index인 iterator 

    forward_array( i, a )

        cout << a[ i ] << endl;

    cout << endl;


    // i 는 배열 a 의 마지막 요소부터 첫 요소까지의 index인 iterator 

    backward_array( i, a )

        cout << a[ i ] << endl;

    cout << endl;


    // i는 100 이 최솟값이고 3씩 감소하는 5개의 iterator

    for_min( i, 100, 5, -3 ) 

        cout << i << endl;

    cout << endl;


    // i는 100 이 최댓값이고 3씩 증가하는 5개의 iterator

    for_max( i, 100, 5, 3 )

        cout << i << endl;

    cout << endl;


    // i는 100.5 가 최댓값이고 3.5씩 감소하는 5개의 iterator

    for_max( i, 100.5, 5, -3.5 )

        cout << i << endl;

    cout << endl;


    return 0;

}

//-----------------------------------------------------------------------------


결과는


0

1

2

3

4


4

3

2

1

0


1

2

3

4

5


5

4

3

2

1


112

109

106

103

100


88

91

94

97

100


100.5

97

93.5

90

86.5


원하는 min, max값을 가지도록 begin, end 를 자동으로 계산해주는것 :)

100 - i 처럼 쓰는 것 보단 최적화도 굿~!

for 문을 좀 더 명시적으로 사용해서 알아보기도 좋을듯.


네이밍은 대충했는데, #define 매크로가 legacy 라지만, scope 안건드리는게 장점이니깐.

카페에 올린글 복붙~