C ++ - вернуть x, y; Какой смысл? - PullRequest
46 голосов
/ 29 марта 2010

Я программировал на C и C ++ в течение нескольких лет, и сейчас я просто учусь на курсах в колледже, и в нашей книге была приведена такая функция, например:

int foo(){
  int x=0;
  int y=20;
  return x,y; //y is always returned
}

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

(Кроме того, я также пометил C, потому что это относится к обоим, хотя моя книга специально написана на C ++)

Ответы [ 18 ]

1 голос
/ 29 марта 2010

С одной стороны, это может быть честной ошибкой со стороны автора.

С другой стороны, автор может объяснять синтаксически правильный правильный код вместо предупреждений компилятора.

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

1 голос
/ 29 марта 2010

Вне циклов for другой основной пользователь этого оператора comman (в зависимости от версии вызова функции) находится в макросах, которые возвращают значение после выполнения некоторой работы. Это другие способы сделать это сейчас, но я думаю, что оператор comman раньше был самым чистым способом.

#define next(A, x, y, M) ((x) = (++(y))%(M) , A[(x)])

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

1 голос
/ 29 марта 2010

Это оператор запятой. Такой синтаксис можно использовать для отключения предупреждения от компилятора о неиспользуемой переменной x.

0 голосов
/ 31 октября 2016

Если y всегда возвращается, тогда какой смысл?

Точка является побочным эффектом x (то есть с левой стороны от оператора запятой). Смотрите, например Джастин Этьер ответит за подробности.

Есть ли случай, когда нужно было бы создать инструкцию возврата, как это?

Примером является функция constexpr в C ++ 11 до C ++ 14: такая функция может содержать не произвольные операторы, а ровно один оператор возврата.

Вот пример кода из Патриса Ройса «Исключительная ситуация» на CppCon 2016 :

constexpr int integral_div(int num, int denom) {
    return assert(denom != 0), num / denom;
}
0 голосов
/ 07 января 2016

При использовании с ключевым словом return оператор запятой возвращает значение last , которое изначально сбивает с толку , но может сделать вещи более краткими .

Например, следующая программа завершит работу с кодом состояния 2.

#include <iostream>
using namespace std;

void a() {
    cout << "a" << endl;
}


int one() {
    cout << "one" << endl;
    return 1;
}

int zero() {
    cout << "zero" << endl;
    return 0;
}

int main() {
    return one(), a(), zero(), 2;
}

При компиляции и выполнении следующих действий вы увидите вывод ниже.

michael$ g++ main.cpp -o main.out && ./main.out ; echo $?
one
a
zero
2
0 голосов
/ 26 июня 2014

Книга пытается устранить потенциальную путаницу людей, которые изучали другие языки до C ++. Во многих языках вы можете возвращать несколько значений, используя похожий синтаксис. В C ++ он будет компилироваться без предупреждения (если вы не укажете -Wall или -Wunused-value), но он не будет работать так, как вы ожидаете, если вы привыкли к этим другим языкам. Он просто вернет последнее значение.

Однако, кажется, что автор вызвал больше путаницы, чем предотвратил, поскольку в C ++ нет читаемой ситуации, чтобы использовать такой синтаксис в операторе возврата, кроме случайного использования его как другого языка. Он предупреждает об использовании, которое большинству людей не придет в голову попробовать. Однако, если вы это сделаете, отладка будет очень запутанной, поскольку оператор множественного присваивания int x, y = foo() также прекрасно компилируется.

Итог: всегда используйте -Wall и исправьте то, о чем вас предупреждает. Синтаксис C ++ позволяет писать много вещей, которые не имеют смысла.

0 голосов
/ 11 сентября 2013

Я видел этот синтаксис, используемый в C для ведения домашнего хозяйства при возвращении на полпути в операции. Определенно не поддерживаемый код:

int foo(int y){
  char *x;
  x = (char*)malloc(y+1);
  /** operations */
  if (y>100) return free(x),y;
  /** operations */
  if (y>1000) return free(x),y;

}
0 голосов
/ 25 сентября 2010

Есть ли случай, когда нужно было бы создать инструкцию возврата, как это?

IMO, я бы никогда не использовал несколько возвратов в функции, как в примере с книгой. Это нарушает структурированный дизайн. Тем не менее, есть много программистов, которые делают! Отладка чужого кода Я присвоил значение глобальной переменной в каждом операторе возврата, чтобы я мог выяснить, какой возврат выполнен.

...