Функция возвращает значение без оператора возврата

Для BSD или GNU grep можно использовать -B num для установки сколько строк перед соответствием и -A num для количества строк после соответствия.

grep -B 3 -A 2 foo README.txt

, Если Вы хотите то же количество строк прежде и после того, как можно будет использовать -C num.

grep -C 3 foo README.txt

Это покажет 3 строки прежде и 3 строки после.

19
задан Pascal Bayer 10 January 2011 в 08:25
поделиться

2 ответа

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

Это разъяснено в разделе 6.9.1p12 стандарт C :

, Если }, который завершает функцию, достигнут, и значение вызова функции используется вызывающей стороной, поведение не определено.

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

Так мораль истории: если функция говорит, что возвращает значение, всегда возвращают значение.

4
ответ дан 30 November 2019 в 02:18
поделиться

Официальная формулировка:

6.9.1 Функциональных определений
...
12, Если }, который завершает функцию, достигнут, и значение вызова функции используется вызывающей стороной, поведение не определено.

, где "неопределенный benavior" означает:

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

2, ОТМЕЧАЕТ Возможные неопределенные диапазоны поведения от игнорирования ситуации полностью с непредсказуемыми результатами, к поведению во время перевода или выполнения программы в зарегистрированной характеристике способа среды (с или без выпуска сообщения диагностики), к завершению перевода или выполнения (с выпуском сообщения диагностики).

3 ПРИМЕРА примером неопределенного поведения является поведение на целочисленном переполнении.

Проект

Онлайн 2011 года C, Хотите верьте, хотите нет, функция ввела, что-то другое, чем void не , потребовал иметь return оператор. Это не осуществляется языковой грамматикой, и нет никакого ограничения, которое не - void функция должна содержать return оператор. Единственные ограничения состоят в том, что, если это присутствует, return оператор в void, функция не возвращает значение любого выражения, и что return оператор в не - void функция должна возвратить значение выражения.

, Почему имеет место это?

C первоначально не имел void тип данных, и не было никакого способа определить подпрограмму, которая только выполнялась для ее побочных эффектов и не возвратила значение. Не было никакого хорошего способа "ничего" не возвратить, таким образом, return оператор не требовался. C также в это время имел "неявный int" объявления - Вы могли определить тело функции без типа, и компилятор будет принимать , он был введен int:

foo( a, b )   // old style parameter declarations
  int a;      // still legal, but no longer really used
  char *b;    // for very good reasons
{
  // do something interesting with a and b
}

foo неявно вводится для возврата int, даже если никакое значение явно не возвращается. Это хорошо, пока вызывающая сторона не пробует к [1 133] использование foo несуществующее возвращаемое значение. Так вид конвенции разработанных, где "процедуры" (функции, выполняемые только для побочных эффектов), не были явно введены и не имели никакого return оператор.

, поскольку унаследованный код навсегда, поведение относительно [1 118], операторы не были изменены в более поздних версиях стандарта C, даже при том, что неявный int объявления были удалены в C99.

0
ответ дан 30 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: