LINUX.ORG.RU

История изменений

Исправление Xenius, (текущая версия) :

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

В Си нет процедур как таковых. Ещё там нет массивов, строк, символьного типа (char - это однобайтовое целое) и многого другого. Но всё это можно эмулировать, например строку через массив (не совсем настоящий массив) char-ов с нулём в конце.

Различие между процедурами и функциями есть в паскале, там они объявляются соответствующими словами, процедура не возвращает значение и её вызов сам по себе является оператором (statement), а функция возвращает значение и используется в выражении.

Понятие побочного эффекта определено для выражения. Процедура не входит в выражение, поэтому её действия не считаются побочными эффектами (ввод-вывод всякий, модификация общих переменных и тд). Функция входит в выражение. Поэтому если она что-то значимое меняет кроме своего возвращаемого значения, то это считается побочным эффектом.

Побочных эффектов следует избегать, поэтому Столяров предлагает действия оформлять в виде процедур, а если им нужно передать что-то вызывающему коду, использовать var или out параметр.

В Си ситуация другая, там нет процедур, поэтому в тех ситуциях где в паскале была бы процедура, лучше использвать void-функцию, если не нужно возвращать значение. Но если нужно, можно взять и просто функцию, но если у неё есть побочные эффекты, стараться использовать её только в самых простых выражениях вроде var=side_effect_func(); и не пихать её например в заголовки циклов, аргументы других функций и подобное.

Все эти рекомендации служат для облегчения чтения кода в дальнейшем и уменьшения количества ошибок.

Исходная версия Xenius, :

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

В Си нет процедур как таковых. Ещё там нет массивов, строк, символьного типа (char - это однобайтовое целое) и многого другого. Но всё это можно эмулировать, например строку через массив char-ов с нулём в конце.

Различие между процедурами и функциями есть в паскале, там они объявляются соответствующими словами, процедура не возвращает значение и её вызов сам по себе является оператором (statement), а функция возвращает значение и используется в выражении.

Понятие побочного эффекта определено для выражения. Процедура не входит в выражение, поэтому её действия не считаются побочными эффектами (ввод-вывод всякий, модификация общих переменных и тд). Функция входит в выражение. Поэтому если она что-то значимое меняет кроме своего возвращаемого значения, то это считается побочным эффектом.

Побочных эффектов следует избегать, поэтому Столяров предлагает действия оформлять в виде процедур, а если им нужно передать что-то вызывающему коду, использовать var или out параметр.

В Си ситуация другая, там нет процедур, поэтому в тех ситуциях где в паскале была бы процедура, лучше использвать void-функцию, если не нужно возвращать значение. Но если нужно, можно взять и просто функцию, но если у неё есть побочные эффекты, стараться использовать её только в самых простых выражениях вроде var=side_effect_func(); и не пихать её например в заголовки циклов, аргументы других функций и подобное.

Все эти рекомендации служат для облегчения чтения кода в дальнейшем и уменьшения количества ошибок.