확장된 문법에는 범위 한정 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 )
for( auto 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 )
for( const auto it_end = top - _max_to(delta, count) + delta;
it != it_end; it += delta ) // 최적화 ok
#define for_min( it, base, count, delta )
for( auto 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 )
for( const 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 안건드리는게 장점이니깐.
카페에 올린글 복붙~
매크로 개행할때 백슬래시 사라진다. 알아서 넣으렴. 귀찮으면 까페가서 퍼가든지.
몸관리잘하쇼
ㄴ 사랑해
쩐당
애매한 소숫점은 책임 못짐유~ 만들어쓰시길~