Как проверить возвращаемое значение из функции для нескольких значений без сохранения в переменной - PullRequest
0 голосов
/ 11 марта 2020

Как я могу достичь чего-то подобного ...

int main(void)
{
  if (f(x) == (a || b))
  {
     puts("Success");
  }
  return (0);
}

Это вывело бы «Успех», если возвращение f (x) равно a или b. Я знаю, что это можно сохранить в переменной, но мой вопрос: «Можно ли что-то подобное сделать, вызвав функцию f (x) только один раз, без использования переменной

Редактировать 1: мне не разрешено использовать оператор switch для этого назначения

Редактировать 2: Могу ли я установить диапазон только с одним выражением, подобным этому?

if ( 2 < f(x) < 5)

Было бы это допустимый (тип возвращаемого значения int)?

Ответы [ 3 ]

2 голосов
/ 11 марта 2020

как проверить множественные возвращаемые значения из функции, вызываемой один раз, без сохранения в переменной (?)

Не совсем, но с некоторыми ограничениями, давайте злоупотребим C и предположим, a, b и f() возвращают символ.

1 Формируют массив символов, состоящий из a и b, и ищите его, используя memchr(). Вдохновленный @ David C. Rankin (он не хранит результат f() в переменной, но вызывает функцию)

int main(void) {
  //         v-------------v compound literal
  if (memchr((char [2]){a,b}, f(x), 2)) {
     puts("Success");
  } 
  return 0;
}

Я вижу добавленный OP "тип возвращаемого значения int" - О, хорошо .


if ( 2 < f(x) < 5) - допустимый код, но он не выполняет то, что хочет OP.

Это как if ( (2 < f(x)) < 5), который сравнивает f(x) с 2 и приводит к 0 или 1, что всегда меньше 5.


Жесткая толпа сегодня, так как насчет ниже. Требуется немного математического расширения для int overflow`, но он близок.

abs(2*f(x) - (a+b)) == abs(a-b)

1 Несерьезные предложения по коду для производственного кода - используйте временный.

1 голос
/ 11 марта 2020

Очевидно, что это можно сделать с помощью оператора switch. Другим способом будет вызов функции, возвращающей значение true или false с первым значением функции в качестве входного, другим способом может быть таблица переходов или даже > или проверка битов с использованием бинарных операторов в зависимости от значений a и b (очень часто для тестирования многобитовых флаги сразу).

Но на самом деле вам не следует беспокоиться об использовании или не использовании переменной в таких случаях. Текущие компиляторы неплохо помещают временные переменные, подобные этим, в регистры.

РЕДАКТИРОВАТЬ: учитывая ограничения, наиболее вероятным решением является использование некоторого бита fu, но оно полностью зависит от значений a и b и c, и др c. Обычный способ - использовать степени двух в качестве значений для проверки. Затем вы можете проверить набор значений только в одной операции.

например: a = 1, b = 2, c = 4

if (f(x) & (1+2+4)) {...}

проверяет, есть ли у нас или b или c или суперпозиция этих значений.

0 голосов
/ 11 марта 2020

C язык не имеет таких конструкций. Вам нужно сохранить результат функции или / и оба a & b.

Конечно, вы можете:

int compare(int a, int b, int f)
{
    if(a == f || b == f) { puts("Success"); return 0;}
    return -1;
}

int f(int x)
{
    return x * x;;
}

int main()
{
    compare(5,8,f(3));
}

, но, конечно, все значения сохраняются как параметры функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...