2016-07-13 6 views
-4

Ich möchte eine kurze for-Schleife schreiben (mit oder ohne Makro), die durch Erraten, ob der Startpunkt ist kleiner oder größer (oder gleich) auf den Endpunkt, etwas wie folgt:C++ for Schleife kurze 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 

Kurz gesagt, ich möchte in Kürze eine starke schreiben ... Ist das möglich?

Wenn nicht, gibt es einen anderen Weg?

+0

Die Verwendung von 'cout << i 'erfordert weniger Eingabe als ein' printf'. –

+1

Inline-Funktionen bevorzugen Makros. Makros sind böse. –

+0

Ich brauche Code nicht schreiben, um lesbar zu sein, es ist nur für mich :) – Daniel

Antwort

1

Das ist ganz in der Nähe, was Sie erwartet:

#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

nette Lösung, nur das = fehlt ... gibt es eine Möglichkeit, es einzufügen? (Ich benutze immer für mit int so Typ ist nicht notwendig) – Daniel

+0

@Daniel: das würde wahrscheinlich brauchen den Körper der Schleife als Funktionsparameter, etwas, was Sie nicht wirklich mögen, denke ich. (Das Problem ist, dass Sie den Namen des Schleifenindex kennen müssen. Er kann nicht nur "i" sein, da Sie geschachtelte Schleifen verwenden möchten.) Entweder das, oder Sie führen einen Typ mit einem überladenen 'operator =()' ein mach nicht was du denkst. – lorro

0

Wenn Sie davon ausgehen, dass alle Werte ganze Zahlen sind, so etwas wie dies könnte funktionieren:

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

Dann nutzen Sie ist auf diese Weise:

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

Ich hatte schon daran gedacht, aber das Problem ist die = Anweisung ... – Daniel

+0

@Daniel: Ich verstehe nicht, warum die '=' Anweisung ein Problem ist ... Ich habe es versucht und es funktioniert ... Oder Sie meinen, wenn Sie das Makro verwenden? Dann schreib es einfach nicht. – rodrigo