2016-07-13 2 views
-4

시작점이 끝점보다 작거나 같은지를 추측하여 작동하는 짧은 for-loop (매크로가 있거나 없음)를 작성하고자합니다.C++ for short short syntax

fr(i = 0 .. 3) printf("%d ", i) 
    output: 0 1 2 3 

fr(i = 8 .. 3) printf("%d ", i) 
    ouput: 8 7 6 5 4 3 

fr(i = 3 ..< 6) printf("%d ", i) 
    output: 3 4 5 

fr(i = 5 ..> 1) printf("%d ", i) 
    output: 5 4 3 2 

간단히 말해서, 나는 짧은 방법으로 강력한 것을 쓰고 싶습니다 ... 가능합니까?

그렇지 않은 경우 다른 방법이 있습니까? 당신은 모든 값이 정수라고 가정하면

+0

'cout << i'는'printf'보다 적은 타이핑을 필요로합니다. –

+1

매크로에 인라인 함수를 사용하십시오. 매크로는 악합니다. –

+0

읽을 필요가 없도록 코드를 작성할 필요가 없습니다. – Daniel

답변

1

이것은 당신이 기대했던 아주 가까이 :

#define MYFOR(i,a,b) for (int i = (a); i != (b); i = (a)<(b)? i+1 : i-1) 

그런 다음 사용이 방법

#include <iostream> 
#include <algorithm> 

#define LT -1 + 
#define GT 1 + 
#define FR(type, var, from, to) for(type dir = (from < to)? 1: -1, i = from; i != to + dir; i += dir) 

int main() { 
    FR(int, i, 0, 3) std::cout << i << " "; 
    std::cout << std::endl; 

    FR(int, i, 8, 3) std::cout << i << " "; 
    std::cout << std::endl; 

    FR(int, i, 3, LT 6) std::cout << i << " "; 
    std::cout << std::endl; 

    FR(int, i, 5, GT 1) std::cout << i << " "; 
    std::cout << std::endl; 
} 
+0

멋진 솔루션, 누락 된 부분 만 ... 삽입하는 방법이 있습니까? (나는 항상 int를 사용하므로 타입은 필요하지 않습니다.) – Daniel

+0

@Daniel : 아마도 함수의 매개 변수로 루프의 몸을 가져 가야 할 것입니다. (문제는 루프 인덱스 이름을 알아야한다는 것입니다. 중첩 된 루프가 필요할 수도 있으므로 'i'일 수는 없습니다.) 또는 연산자가 오버로드 된 타입을 도입 할 것입니다. 네가 생각하는 것을하지 마라. – lorro

0

, 이런 걸 그냥 작동 수 있습니다

MYFOR(i, 0, 10) printf("%d ", i); 
MYFOR(i, 5, 0) printf("%d ", i); 
+0

나는 이것에 대해 이미 생각했지만 문제는 = statement ... – Daniel

+0

@Daniel : 왜'= '문이 문제인지 나는 알지 못한다. 나는 시도해 보았다. 매크로를 사용할 때 말이야? 그럼 그냥 쓰지 마라. – rodrigo

관련 문제