396 Stimmen

MIN und MAX in C

Wo sind MIN y MAX in C definiert, wenn überhaupt?

Wie lassen sich diese am besten implementieren, und zwar so generisch und typsicher wie möglich? (Compiler-Erweiterungen/Builtins für Mainstream-Compiler bevorzugt.)

2voto

cmdLP Punkte 1460

Alte GCC-Erweiterung: Operatoren <?, >?, <?=, >?=

In einer sehr alten Version des GCC gab es die Operatoren <?, >? (siehe aquí (hier war es in C++, aber ich glaube, es galt damals auch als C-Erweiterung) Ich habe auch die Operatoren gesehen <?=, >?= die den Zuweisungsanweisungen entsprechen.

Die Operanden wurden einmal ausgewertet und ermöglichten sogar eine sehr kurze Zuweisungsanweisung. Sie ist sehr kurz im Vergleich zu üblichen Min/Max-Zuweisungen. Es gibt nichts, was dies übertreffen kann.

Diese waren eine Abkürzung für Folgendes:

min(a, b)   ===   a < b ? a : b   ===   a <? b;
max(a, b)   ===   a > b ? a : b   ===   a >? b;
a = min(a, b);   ===   if(b < a) a = b;   ===   a <?= b;
a = max(a, b);   ===   if(b > a) a = b;   ===   a >?= b;

Die Suche nach dem Minimum ist sehr übersichtlich:

int find_min(const int* ints, int num_ints)
{
    assert(num_ints > 0);
    int min = ints[0];
    for(int i = 1; i < num_ints; ++i)
        min <?= ints[i];
    return min;
}

Ich hoffe, dass dies eines Tages wieder in den GCC aufgenommen wird, denn ich halte diese Betreiber für genial.

1voto

Bas Kuenen Punkte 59

Ich weiß, der Typ sagte "C"... Aber wenn Sie die Chance haben, verwenden Sie eine C++-Vorlage:

template<class T> T min(T a, T b) { return a < b ? a : b; }

Tippsicher, und keine Probleme mit dem in anderen Kommentaren erwähnten ++.

-1voto

NRZ Punkte 23

Das Maximum von zwei ganzen Zahlen a y b es (int)(0.5((a+b)+abs(a-b))) . Dies kann auch funktionieren mit (double) y fabs(a-b) für Doubles (ähnlich für Floats)

-4voto

srezat Punkte 1

Der einfachste Weg ist die Definition als globale Funktion in einer .h Datei, und rufen Sie sie auf, wann immer Sie wollen, wenn Ihr Programm modular ist und viele Dateien enthält. Wenn nicht, double MIN(a,b){return (a<b?a:b)} ist der einfachste Weg.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X