Программирование на языке Си: Первая программа на Си. Функции.

октября 29, 2011  |  Published in Си и C++  |  4 Comments

язык СиЗнакомство с языком Си мы начнем с написания простой программы «Hello, World!», которая будет заниматься печатью на экран сообщения «Hello, World!».

Язык Си относится к процедурным (императивным) языкам программирования, а значит программа на Си является ни чем иным, как описанием последовательности действий — алгоритма выполнения определенной задачи. Си обладает концепцией основной функцией программы, т.е. любая программа на Си должна содержать функцию main(). Функция main() как раз и занимается тем, что предоставляет алгоритм выполнения нашей программы без углубления в детали его работы. Детали работы алгоритма принято выносить в отдельные функции, а их, при необходимости, в библиотеки.

Первая программа:

#include <stdio.h>
int main() {
  printf("Hello, World!\n");
  return(0);
}

В первой строке мы объявляем функцию main() которая имеет тип int (integer). Тип функции — это тип данных, которые функция возвращает после своего выполнения. int main() говорит о том, что функция main() должна возвращать целое число. В Unix-системах (unix, bsd, linux, macos  и т.д.) принято соглашение о том, что программа после своего успешного завершения должна возвратить 0, если возвращено любое другое значение, то программа сработала неправильно, в Windows системах такого соглашения нет, поэтому мы можем объявлять функции типа void, т.е. такие, что ничего не возвращают в систему:

#include <stdio.h>
void main(){
  printf("Hello, World!\n");
}

Чтобы превратить код на Си в программу необходимо воспользоваться компилятором Си. Компилятор Си — это такая программа, которая преобразует код на Си в машинный код, который понятен компьютеру. В операционной системе Ubuntu, счастливым пользователем которой я являюсь имеется предустановленный набор компиляторов GCC, который включает в себя компилятор СС (C Compiler). CC является не самым лучшим компилятором, однако входит в 3 лидеров и является предустановленным компилятором в большинстве дистрибутивов GNU/Linux. В нашем обучении нам не нужна какая-либо сверх оптимизация наших приложений, по этому нам его будет вполне достаточно. Для компиляции программы запустите компилятор в командной строке и скормите ему имя файла:

$ cc program.c
$ ./a.out
Hello, World!

Поскольку имя явно не указано, наш код на Си будет скомпилирован в директорию с исходником программы и будет иметь название a.out. Если вызвать компилятор с опцией —help, то мы увидим множество других интересных опций компилятора, например -o, которая позволяет казать путь и имя для сохранения скомпилированной программы:

$ cc program.c -o program
$ ./program
Hello, World!

Функции
При необходимости мы можем вынести функционал из функции main() в другие функции таким образом несколько абстрагируя основной алгоритм программы. Это означает, что main() — это функция менеджер, которая должна выполнять минимум самостоятельной работы, но должна управлять работниками — другими функциями. давайте перепишем нашу программу с использование функции hello_world():

#include <stdio.h>

void hello_world();

int main() {
  hello_world();
  return(0);
}

void hello_world(){
  printf("Hello, World!\n");
}

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

Примечания:

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

2. Вам наверное интересно узнать что за код находится в первой строке нашего исходника:

#include <stdio.h>

Этот код является директивой препроцессора, то есть это инструкция для компилятора, которая выполняется только в процессе компиляции программы. В нашем случае эта директива требует от компилятора включение в нашу программу заголовочного файла stdio.h, который входит в стандартную библиотеку языка СИ. Сам Си очень минималистичен, множество полезных функций вынесены в стандартную библиотеку языка и могут быть при необходимости подключены через директивы препроцессора. В заголовочном файле stdio.h находятся определения функций для работы со стандартными устройствами ввода и вывода, например функция форматированного вывода — printf(), которой мы пользовались в наших примерах.

3. Иногда можно встретить функции в списке аргументов которых встречается ключевое слово void:

int main(void){
  //code here
}

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

Tags: ,

Responses

  1. Валентин says:

    октября 30, 2011 at 22:46 (#)

    Ну вот зачем писать такие статьи ?

    Сами подумайте , какой имеет авторитет программист который пытается учить других программированию на ruby а сам пишет только hello word на си :(

    Я понимаю что вы студент, но постарайтесь определиться — либо вы пишите профессиональные статьи выбранной тематики , либо переписываете свои домашние задания в блог. Первое ещё можно назвать интересным , второе же очень сомневаюсь

  2. Julya says:

    марта 1, 2012 at 16:07 (#)

    Полезно для начинающего, спасибо!

  3. Reloader says:

    апреля 1, 2012 at 19:03 (#)

    Блин, вот я пытаюсь начать изучать С…
    и сколько я бы не искал «первые программы», или «Для начинающих», я наталкиваюсь на вот такие вот статейки, клонированные примеры «Hello World». И все… Авторы после написания такой статьи начинают чувствовать себя Страуструпами, величайшими программерами, и т.д. а вот ДАЛЬШЕ никто уже ничего и не пишет! всех просто распирает от собственного величия, и написание следующих статей для таких «аффтараф» — не царское дело!
    Блин, на если собрался писать статьи для начинающих — то хотыбы 2(!) статьи напиши! или что-либо более оригинальное, чем Ctrl+C Ctrl+V!

  4. admin says:

    апреля 2, 2012 at 00:03 (#)

    Reloader, понимаю тебя, но войди в мое положение. У меня работа и ограничено время, а статьи по Си я буду обязательно продолжать писать.

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.