Для 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 строки после.
Если функция определяется для возврата значения, но не делает, и функция вызова пытается использовать возвращаемое значение, Вы вызываете неопределенное поведение .
Это разъяснено в разделе 6.9.1p12 стандарт C :
, Если
}
, который завершает функцию, достигнут, и значение вызова функции используется вызывающей стороной, поведение не определено.
Вы стали "удачливыми" в этом случае, что программа, казалось, работала правильно, но нет никакой гарантии этого. Вы скомпилировали с различными настройками оптимизации или другим компилятором в целом, Вы могли закончить с различными результатами.
Так мораль истории: если функция говорит, что возвращает значение, всегда возвращают значение.
Официальная формулировка:
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.