функция не заканчивается оператором возврата - PullRequest
0 голосов
/ 25 января 2019

Я новичок в C, но я знаю основы кодирования. Однако я не могу понять, почему компилятор возвращает ошибку:

Функция ".." не заканчивается оператором возврата!

Вот мой код:

string same_start_end(string s)

{
  char first_letter = string_charat(s, 0);
  string empty = "";
  if( string_length(s) <= 1)
  {
      return s;
  }
  else if (string_length(s) > 1)
  {
      for (int  i = 0; i < string_length(s); i++)
      {
          if( (string_charat(s, i) == first_letter) && (i != 0))
          {
              return string_sub(s, 0,i);
          }
      }
  }

}

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Компилятор предупреждает, что элемент управления может достигать конца вашей функции, не являющейся пустым, потому что элемент управления может достигать конца вашей функции, не являющейся пустым.

Чтобы предотвратить это, вы должны выполнить одно из:

  • Отключить предупреждение компилятора.(С Clang это делает опция командной строки -Wno-return-type.) (В C разрешено, чтобы не пустая функция могла вытекать из конца функции без возврата значения, при условии, что вызывающая сторона не пытается использоватьвозвращаемое значение.)
  • Укажите компилятору, что функция возвращает.

Существует два пути, в которых компилятору не ясно, что функция возвращает.

Сначала рассмотрим:

if (string_length(s) <= 1)
   …
else if (string_length(s) > 1)

Математически мы знаем, что либо x ≤ 1, либо x > 1, поэтому “ x ≤ 1 или x > 1 ”верно.Однако компилятор не знает, что первый вызов string_length(s) возвращает то же значение, что и второй вызов.Поэтому он не может знать, что хотя бы одно из этих условий является верным.Он должен предполагать, что они оба могут быть ложными, и тогда управление будет передаваться в конец функции без оператора return.

Некоторые компиляторы имеют функцию, позволяющую объявить функцию равной pure , который сообщит компилятору, что он возвращает то же значение при том же входе, а также не изменяет состояние программы другими способами.Если вы использовали эту функцию, или компилятор мог видеть определение string_length, он мог бы обнаружить, что одно из двух условий истинно.Однако более простой способ исправить это - просто изменить else if (string_length(s) > 1) на else.Тогда компилятор знает , что, если предложение if не выполнено, предложение else должно быть.

Во-вторых, рассмотрим:

for (int  i=0; i<string_length(s);i++)
    {
      if( (string_charat(s,i)==first_letter) && (i!=0))
        {
          return string_sub(s, 0,i);
        }
    }

Этот циклможет закончиться без срабатывания ifs может отсутствовать символ, равный первому символу, поэтому return никогда не выполняется.Затем цикл завершается, и управление переходит к концу функции без оператора return.

Чтобы предотвратить это, вы можете вставить оператор return после цикла for.Он вернет любое значение, которое вы хотите вернуть, если совпадение не найдено.

0 голосов
/ 31 марта 2019

При использовании C и C ++ вы должны быть осторожны при определении функции.Написав string, вы сообщаете компилятору, что эта функция должна возвращать строку.Если вы не хотите этого делать, попробуйте переключиться на void, поскольку void не возвращает значение.Если вы хотите использовать void, но внешние функции по-прежнему знают переменные, вам следует использовать указатели.В вашем случае возврат иногда не исключен

0 голосов
/ 25 января 2019

У вас есть только возвраты в ваших if и else if заявлениях. Если оба из них терпят неудачу, у вас нет возврата. Попробуйте сделать и else вместо else if или иметь оператор return после всех этих.

Edit:

Ваш цикл for ничего не возвращает, если вы перебираете его, и он никогда не запускает оператор if

...