2016-05-04 1 views
4

У меня есть две функции C f1 и f2, которые принимают те же аргументы. Исходя из условия, мне нужно, чтобы вызвать одну или другую с теми же аргументами:C вызов вызова функции с помощью тройного оператора

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

Я понимаю, что можно использовать синтаксис:

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

ли это быть возможным, чтобы иметь DRY синтаксис, который требует записи аргументов за один раз?

+0

в вашем первом параграфе кода, в разделе 'else', должно быть 'f2' – Pierre

+0

что вы имеете в виду, вызывая одну и ту же функцию' f1', если 'condition' является истинным и ложным? Если это опечатка, исправьте ее. – user3078414

+0

да, конечно, это должно быть f2, спасибо –

ответ

5

Да, он отлично работает так же, как вы предложили.

Оператору вызова функции () просто нужна левая сторона, которая вычисляет указатель на функцию, который выполняет имена функций.

При вызове нет указателей на функцию разблокировки функции, оператор () делает это.

Эта программа демонстрирует пример:

#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; 
} 

Он печатает:

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

Там нет ничего странного здесь.

И поскольку C предшествует Python честным битом, возможно, это семантика Python, которая здесь C-ish. Или просто нормальный, конечно. :)

+0

Структура аналогична, но ни синтаксис (у Python нет '? ..:', но 'if .. else' операторов), ни механизмы одинаковы. В отличие от C++, например, Python - это полноценный OOP, а функции также являются объектами первоклассного класса, также как и классы. – Olaf

1

можно использовать указатель на функцию, как это:

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

Вы ответили так, как будто это было для кого-то другого ... – Jack

+1

@Jack, вы должны перечитать раздел справки о задании вопросов. Мы будем рады ответить на наш собственный вопрос, если сможем. Речь идет не только о помощи, но и о расширении базы знаний в SO. – StoryTeller

+2

@ enrico.bacis, но насколько я знаю, ваш синтаксис «pythonic» также должен работать нормально, если функции имеют одинаковые типы/подписи! См. Также http://stackoverflow.com/questions/75538/hidden-features-of-c#comment4498219_302563 – CherryDT