2016-05-04 21 views
4

Ich habe zwei C-Funktionen f1 und f2, die die gleichen Argumente. Basierend auf einem Zustand, muss ich das eine oder das andere mit den gleichen Argumenten aufzurufen:C Funktionsaufruf Auswahl mit ternären Operator

if (condition) { 
    result = f1(a, b, c); 
} else { 
    result = f2(a, b, c); 
} 

Ich verstehe es möglich ist, die Syntax:

result = condition ? f1(a, b, c) : f2(a, b, c) 

Ist es möglich sein, ein haben DRY Syntax, die Argumente einzeln schreiben müssen?

+0

in Ihrem ersten Code-Absatz, in 'else' -Klausel sollte es 'f2' sein – Pierre

+0

Was meinen Sie mit dem Aufruf der gleichen Funktion' f1' wenn 'condition' sowohl wahr als auch falsch ist? Wenn dies ein Tippfehler ist, korrigieren Sie es bitte. – user3078414

+0

ja natürlich sollte es f2 sein, danke –

Antwort

5

Ja, es genau wie Sie vorgeschlagen gut funktioniert.

Der Funktionsaufrufoperator () benötigt nur eine linke Seite, die einen Funktionszeiger auswertet, was die Namen der Funktionen tun.

Es ist nicht notwendig, Funktionszeiger beim Aufruf zu deaktivieren, der Operator () tut dies.

Dieses Beispielprogramm zeigt:

#include <stdio.h> 

static int foo(int x) { 
    return x + 1; 
} 

static int bar(int x) { 
    return x - 1; 
} 

int main(void) { 
    for (int i = 0; i < 10; ++i) 
     printf("%d -> %d\n", i, (i & 1 ? foo : bar)(i)); 
    return 0; 
} 

Er druckt:

0 -> -1 
1 -> 2 
2 -> 1 
3 -> 4 
4 -> 3 
5 -> 6 
6 -> 5 
7 -> 8 
8 -> 7 
9 -> 10 

Es gibt hier nichts fremd.

Und da C Python um ein gutes Stück voraus ist, ist es vielleicht Pythons Semantik, die hier C-ish ist. Oder einfach nur gesund, natürlich. :)

+0

Die Struktur ist ähnlich, aber weder die Syntax (Python hat nicht '? ..:', sondern 'if .. else' Operatoren) noch die Mechanismen sind die gleichen. Im Gegensatz zu C++ ist Python zum Beispiel ein ausgewachsenes OOP und Funktionen sind auch erstklassige Objekte - ebenso wie Klassen. – Olaf

1

Es ist möglich, einen Funktionszeiger wie folgt zu verwenden:

int (*f)(int, int, int, ...); 
f = condition ? f1 : f2; 
result = (*f)(a, b, c, ...); 
+1

Sie haben darauf geantwortet, als wäre es für jemand anderen ... – Jack

+1

@Jack, Sie sollten den Hilfebereich zum Stellen von Fragen erneut lesen. Wir werden ermutigt, unsere eigene Frage zu beantworten, wenn wir können. Hier geht es nicht nur um Hilfe, es geht darum, die Wissensbasis bei SO zu erweitern. – StoryTeller

+2

@ enrico.bacis, aber soweit ich weiß, sollte Ihre "pythonische" Syntax auch gut funktionieren, vorausgesetzt, die Funktionen haben die gleichen Typen/Signaturen! Siehe auch http://stackoverflow.com/questions/75538/hidden-features-of-c#comment4498219_302563 – CherryDT