Могу ли я получить доступ к возвращаемому значению функции дважды, не сохраняя его в переменной или не вызывая функцию снова? - PullRequest
0 голосов
/ 05 июня 2019

Функция id_data_valid(data) может возвращать 0 или заданный код ошибки (-1, 1, -2, 2, ..., N).Есть ли способ в C использовать возвращаемое значение функции, не определяя новую переменную, или дважды вызывая функцию, как показано в примерах ниже?

/* Store return value */
int response = id_data_valid(data);
if (response != 0) {
    return response;
}

/* Double function call */
if (id_data_valid(data) != 0) {
    return id_data_valid(data);
}

Ответы [ 2 ]

4 голосов
/ 05 июня 2019

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

В Bash есть функция, которая вам подходит.Там код выхода latest (возвращаемое значение) хранится во встроенной глобальной переменной, называемой $?, но эта функция не существует в C, и я не вижу смысла ни в таком языке, как CПодобный фрагмент в Bash может выглядеть так:

if ! my_command; then
    exit "$?"
fi

Но Bash - это совершенно другой язык.Я не вижу, как такая функция была бы хороша в C.

Я бы выбрал первый вариант с объявлением новой переменной.Второй вариант также подходит при условии , что функция не имеет побочных эффектов.

без определения новой переменной

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

Единственное, что вы можете сделать, чтобы предотвратить использование переменной в будущем, - это поместить все в область видимости.Это эквивалент C кода C ++, который Вирсавия показала в другом ответе.

{ // Extra brace
int response = id_data_valid(data);
if (response != 0) {
    return response;
}}

// Now response has gone out of scope, so this would be an error
if(response == 0) { 

С одной стороны, это хорошо, потому что он инкапсулирует временные переменные.Но с другой стороны, если вам действительно нужна эта конструкция, это очень хороший признак того, что вам следует переосмыслить свой дизайн.

0 голосов
/ 05 июня 2019

есть ли способ в C использовать возвращаемое значение функции, не определяя новую переменную, или дважды вызывая функцию [...]?

Да, с switch

switch (id_data_valid(data)) {
    default: return 0;
    case 1: /* ... */ return 1;
    case -1: /* ... */ return -1;
    case 2: /* ... */ return 2;
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...