Возможно, вы слышали, что вам нужно быть знакомым с Objective-C, если вы планируете разрабатывать приложения для iOS. В то время как Objective-C действительно является важным компонентом разработки под iOS, люди склонны забывать, что Objective-C является строгим надмножеством C. Другими словами, также важно знать основы C как разработчика iOS. Не беспокойся, хотя. Если вы уже знакомы с основами программирования, С не составит труда подобрать.
Предпосылки
Невозможно охватить основы программирования и изучить язык Си в одной статье. Поэтому я предполагаю, что у вас уже есть опыт программирования. Ruby, PHP или JavaScript являются хорошими отправными точками для изучения C и Objective-C, поэтому, если вы пришли из веб-разработки, у вас не должно возникнуть проблем с изучением основ C, прочитав эту статью.
В этой статье я остановлюсь на том, что делает C уникальным или отличным от других языков программирования. Это означает, что я не буду рассматривать основные концепции и шаблоны программирования, такие как переменные и циклы. Я расскажу, как переменные объявляются в C и каковы указатели. Другими словами, основное внимание уделяется вещам, которые вам нужно знать, чтобы ознакомиться с C.
Вступление
Деннис Ритчи начал разрабатывать C в конце 1960-х, работая в AT & T Bell Labs. Благодаря широкому использованию и простоте конструкции, C может использоваться практически на любой платформе. Он не привязан ни к одной операционной системе или платформе. Если вы изучали другие языки программирования, вы могли заметить, что они имеют много общего. Многие языки были вдохновлены C, такие как C #, Java, PHP и Python.
Деннис Ритчи назвал свой новый язык C, потому что он черпал вдохновение из предшествующего языка, разработанного Кеном Томпсоном под названием B. Несмотря на тот факт, что C вдохновлен типизированными языками (BCPL Мартина Ричардса и B Кена Томпсона), C является типизированным языком. Я подробнее расскажу о наборе текста позже в этой статье.
Это не займет много времени, чтобы изучить основы C, потому что это довольно маленький язык с небольшим набором ключевых слов. Вы могли бы сказать, что C очень голый и предлагает только то, что действительно необходимо. Другие функции, такие как операции ввода / вывода, делегируются библиотекам. Сборка кучи и мусора в C отсутствует, и возможна только базовая форма модульности. Тем не менее, небольшой размер языка имеет то преимущество, что его можно быстро выучить.
Несмотря на то, что C — это язык низкого уровня, его нетрудно выучить или использовать. Многие разработчики для iOS и Mac настолько привыкли к Objective-C и его объектно-ориентированному дизайну, что боятся работать с «прямыми» библиотеками C или C. Objective-C — строгий надмножество C и не более чем слой поверх C.
Практика делает совершенным
Язык программирования лучше всего изучается на практике, поэтому давайте создадим новый проект в Xcode и напишем несколько строк на C, чтобы познакомиться с языком. Запустите Xcode и создайте новый проект, выбрав New> Project … в меню File .
Мы не будем создавать iOS-приложения, как мы делали ранее в этой серии. Вместо этого мы создадим проект OS X. Выберите « Приложение» в разделе « OS X» и выберите « Командная строка», чтобы сформировать список шаблонов справа. Нажмите кнопку Далее , чтобы продолжить.
Назовите ваш проект C Primer и дайте ему название организации и идентификатор компании, как мы видели ранее. Установите раскрывающееся меню Тип на C. Единственная опция конфигурации, которая действительно имеет значение для этого урока, это тип. Не беспокойтесь о других вариантах сейчас. Нажмите кнопку Далее , чтобы продолжить.
Скажите Xcode, где вы хотите сохранить новый проект Xcode. Для этого проекта нет необходимости создавать репозиторий git. Мы будем использовать этот проект только для изучения языка C вместо создания полезного инструмента командной строки.
Обзор проекта
По сравнению с iOS-приложением, которое мы создали ранее в этой серии, этот проект на удивление минимален. Фактически, он содержит только два исходных файла: main.c и C_Primer.1 . В целях изучения C, только main.c представляет интерес для нас. Расширение файла .c указывает, что это исходный файл на языке C.
Прежде чем мы соберем и запустим инструмент командной строки, давайте взглянем на содержимое файла main.c. Помимо нескольких комментариев вверху файла и функции с именем main
внизу, исходный файл не содержит много. Файл также содержит оператор include
о котором я расскажу чуть позже в этой статье.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
//
// main.c
// C Primer
//
// Created by Bart Jacobs on 15/02/14.
// Copyright (c) 2014 Tuts+.
//
#include <stdio.h>
int main(int argc, const char * argv[])
{
// insert code here…
printf(«Hello, World!\n»);
return 0;
}
|
Более внимательный взгляд на main
функцию раскрывает несколько интересных характеристик языка программирования Си. Ранее я упоминал, что C является типизированным языком, что означает, что переменные и функции являются типизированными. Реализация функции main
начинается с указания типа возвращаемого значения функции int
. Также обратите внимание, что аргументы функции являются типизированными. Функция ключевого слова, которая распространена во многих других языках, отсутствует в C.
Тело main
функции начинается с комментария (однострочные комментарии начинаются с //
). Вторая строка тела функции — это другая функция, которая является частью стандартной библиотеки C, следовательно, оператор #include
в верхней части файла. В этом случае функция printf
отправляет вывод на стандартный вывод "Hello, World!\n"
. \n
указывает новую строку. Однако в Xcode вывод перенаправляется в консоль Xcode, о которой я расскажу чуть позже.
main
функция завершается возвратом 0
. Когда программа возвращает 0
, это означает, что она успешно завершена. Это все, что происходит в main
функции. Не обращайте внимания на аргументы main
функции, поскольку это выходит за рамки данного руководства.
Построить и запустить
Теперь, когда мы знаем, что делает main
функция, пришло время создать и запустить инструмент командной строки. При сборке приложения код в main.c компилируется в двоичный файл, который затем выполняется. Создайте и запустите инструмент командной строки, нажав треугольную кнопку воспроизведения в верхнем левом углу окна.
Если все прошло хорошо, Xcode должен показать область отладки внизу окна. Вы можете показать и скрыть область отладки, нажав среднюю кнопку элемента управления View на панели инструментов в правом верхнем углу.
Область отладки имеет два раздела. Слева находится окно переменных, а справа — окно консоли . В консоли вы должны увидеть слова Hello, World! , Xcode также сообщает, что программа завершилась с кодом завершения 0
, что означает, что программа завершилась нормально.
В двух словах
В оставшейся части этой статьи я расскажу о наиболее важных характеристиках C. То, что рассматривается в этом руководстве, ограничено тем, что вам нужно знать, чтобы начать разработку под iOS. В следующей статье этой серии я расскажу о Objective-C.
В отличие от интерпретируемых языков, таких как Ruby, PHP и JavaScript, C является скомпилированным языком. Исходный код программы, написанной на скомпилированном языке, сначала компилируется в двоичный файл, специфичный для машины, на которой он был скомпилирован. Процесс компиляции сводит исходный код к инструкциям, которые могут быть понятны машине, на которой он работает. Это также означает, что приложение, скомпилированное на одном компьютере, не может работать на другом компьютере.
Само собой разумеется, что программы, написанные на интерпретируемых языках, также должны быть сведены к инструкциям, которые может понять целевая машина. Этот процесс, однако, происходит во время выполнения. В результате программы, написанные на скомпилированном языке, работают быстрее, чем программы на интерпретируемом языке.
Типы данных
Другое важное отличие от языков, таких как PHP, Ruby и JavaScript, заключается в том, что C является типизированным языком. Это означает, что тип данных, который может содержать переменная, должен быть явно указан. В C основными типами данных являются символы ( char
), целые числа ( int
) и числа с плавающей точкой ( float
). Из этих фундаментальных типов выводится ряд дополнительных типов, таких как double
(число с плавающей запятой двойной точности), long
(целое число, которое может содержать большие значения) и unsigned
(целое число, которое может содержать только положительные значения и, следовательно, большие значения) , Для полного списка основных типов данных C, я рекомендую взглянуть на страницу Википедии о типах данных C.
Вы заметили, что строки не были упомянуты в списке основных типов данных C? Строка AC хранится в виде массива символов. Символ может хранить один символ ASCII, что означает, что массив символов может хранить строку. Посмотрите на следующий пример, чтобы увидеть, что это означает на практике. Квадратные скобки сразу после имени переменной указывают, что мы имеем дело с массивом символов. Строка AC заканчивается нулем, что означает, что последний символ равен 0
.
1
|
char firstName[] = «Bart»;
|
Давайте рассмотрим типизацию более подробно, сравнив два фрагмента кода. Первый фрагмент кода написан на JavaScript, тогда как второй фрагмент написан на C. В JavaScript переменная обычно объявляется с ключевым словом var
. В C нет ключевого слова для объявления переменных. Вместо этого переменная в C объявляется префиксом переменной с типом данных, таким как int
или char
.
var a = 5; var b = 13,456; var c = 'a';
1
2
3
|
int a = 5;
float b = 13.456;
char c = ‘a’;
|
Давайте введем некоторые переменные в main
функцию, которую мы видели ранее. Измените тело main
функции, чтобы оно выглядело как фрагмент кода ниже. Чтобы напечатать переменные с помощью printf
, мы используем спецификаторы формата . Чтобы получить более полный список доступных спецификаторов формата, перейдите по этой ссылке .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
int main(int argc, const char * argv[])
{
// insert code here…
printf(«Hello, World!\n»);
// Variables
int a = 5;
float b = 6.3;
char c = ‘r’;
printf(«this is an int: %i\n», a);
printf(«this is a float: %f\n», b);
printf(«this is a char: %c\n», c);
return 0;
}
|
Как мы видели ранее, в Си типизация не ограничивается переменными. Функции также должны указывать тип, который они возвращают, а также тип аргументов, которые они принимают. Посмотрим, как это работает.
функции
Я предполагаю, что вы уже знакомы с функциями. Как и в других языках, функция C — это блок кода, который выполняет определенную задачу. Давайте сделаем main.c более интересным, введя функцию. Перед main
функцией мы добавили прототип функции. Он сообщает компилятору о функции, типе, который она возвращает, и какие аргументы она принимает. В нижней части main.c мы вставляем реализацию функции. Все, что делает функция — умножает аргумент, который передается в функцию, на пять и возвращает результат.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <stdio.h>
int multiplyByFive(int a);
int main(int argc, const char * argv[])
{
// insert code here…
printf(«Hello, World!\n»);
// Variables
int a = 5;
float b = 6.3;
char c = ‘r’;
printf(«this is an int > %i\n», a);
printf(«this is a float > %f\n», b);
printf(«this is a char > %c\n», c);
// Functions
printf(«Five multiplied by five is %i\n», multiplyByFive(5));
return 0;
}
int multiplyByFive(int a) {
return a * 5;
}
|
Мы также обновили main
функцию, вызвав функцию multiplyByFive
. Обратите внимание, что прототип функции не является строго обязательным при условии, что реализация функции размещена до ее первого вызова. Однако использование прототипов функций полезно, поскольку оно позволяет разработчикам распространять исходный код на несколько файлов и, таким образом, сохранять проект организованным.
Если функция не возвращает значение, тип возвращаемого значения объявляется как void
. По сути, это означает, что функция не возвращает никакого значения. Посмотрите на следующий пример. Обратите внимание, что функция не принимает никаких аргументов. Скобки после имени функции обязательны, даже если функция не принимает никаких аргументов.
1
2
3
4
5
6
7
|
// Function Prototype
void helloWorld();
// Function Implementation
void helloWorld() {
printf(«Hello, World!\n»);
}
|
Прежде чем мы продолжим, я хочу упомянуть, что язык C не имеет ключевого слова function для объявления функции, как в JavaScript или PHP. Скобки после имени функции указывают, что helloWorld
является функцией. То же самое верно для переменных, как я упоминал ранее. Приставляя имя переменной к типу, компилятор знает, что переменная объявляется.
Вам может быть интересно узнать, какие преимущества дает типизированный язык, такой как C. Для программистов, использующих Ruby или PHP, поначалу изучение типизированного языка может быть затруднительным. Основным преимуществом набора текста является то, что вы вынуждены четко указывать на поведение программы. Поймать ошибки во время компиляции — главное преимущество, как мы увидим позже в этой серии. Хотя C является типизированным языком, он не является строго типизированным языком. Большинство компиляторов C предоставляют неявные преобразования (например, char
который преобразуется в int
).
сооружения
Что такое структура? Позвольте мне процитировать Кернигана и Ричи . Структура — это набор из одной или нескольких переменных, возможно, разных типов, сгруппированных под одним именем для удобной обработки. Давайте посмотрим на пример, чтобы увидеть, как работают структуры. Добавьте следующий фрагмент кода прямо перед оператором return
main
функции.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
// Structures
struct Album {
int year;
int tracks;
};
struct Album myAlbum;
struct Album yourAlbum;
myAlbum.year = 1998;
myAlbum.tracks = 20;
yourAlbum.year = 2001;
yourAlbum.tracks = 18;
printf(«My album was released in %i and had %i tracks.\n», myAlbum.year, myAlbum.tracks);
printf(«Your album was released in %i and had %i tracks.\n», yourAlbum.year, yourAlbum.tracks);
|
Мы начинаем с объявления нового типа структуры и присваиваем ему имя Album
. После объявления нового типа мы используем его, указав, что переменная, которую мы собираемся объявить, является структурой, и мы указываем имя структуры, Album
. Точечная нотация используется для присвоения значений и чтения значений из переменных, которые содержит структура.
указатели
Указатели часто являются камнем преткновения для людей, которые хотят изучать C. Хотя определение указателя очень простое. Указатель — это переменная, которая содержит адрес памяти. Имейте в виду, что указатель — это просто еще один тип данных C. Указатели лучше всего понять на примере. Вставьте следующий код непосредственно перед оператором return
main
функции.
1
2
3
4
5
6
7
|
// Pointers
int d = 5;
int *e = &d;
printf(«d has a value of %i\n», d);
printf(«e has a value of %p\n», e);
printf(«the object that e points to has a value of %i\n», *e);
|
Мы начинаем с объявления int
и присваивания ему значения. В следующей строке мы объявляем указатель на int
именем e
, добавляя перед именем переменной звездочку. Амперсанд перед переменной d
— это унарный оператор (причудливое имя для оператора, у которого есть один операнд), который известен как оператор адреса. Другими словами, приставляя переменную d
к амперсанду, нашему указателю e
дается не значение d
, а адрес в памяти, где хранится значение d
. Запомните определение указателя, это переменная, которая содержит адрес переменной.
Операторы print после объявлений переменных сделают этот пример более понятным. Постройте и запустите пример и проверьте вывод в консоли. Значение d
равно 5
как мы ожидаем. Второе заявление о печати может вас удивить. Указатель с именем e
содержит адрес памяти, место в памяти, где хранится значение d
. В последнем утверждении мы используем другой унарный оператор — оператор разыменования или косвенного обращения. Этот оператор выполняет доступ к объекту, который хранится в том месте, на которое указывает указатель. Другими словами, используя оператор разыменования, мы получаем значение d
.
Помните, когда переменная объявляется на языке программирования C, для этой переменной выделяется блок памяти. Указатель просто указывает на этот блок памяти. Другими словами, он содержит ссылку на переменную, которая хранится в блоке памяти. Убедитесь, что вы понимаете концепцию указателей, прежде чем перейти к следующей статье, в которой мы рассмотрим Objective-C. Указатели все время используются при работе с объектами.
Не беспокойтесь, если после прочтения этой статьи указатели не имеют смысла. Часто требуется некоторое время, чтобы действительно понять концепцию. Есть отличный пост, написанный Питером Хоси, который я не могу рекомендовать достаточно.
Запомни точку с запятой
Кажется, что точки с запятой больше не бедра. Руби не любит точки с запятой, и новый крутой парень в городе, CoffeeScript, тоже не любит их. В C и Objective-C точки с запятой требуются в конце каждого оператора. Компилятор не очень простителен, как вы могли заметить.
Вывод
В языке программирования C есть нечто большее, чем то, что я рассмотрел в этой статье. Однако в следующей статье я расскажу об Objective-C, и он постепенно улучшит ваше понимание языка C. Как только мы начнем работать с iOS SDK, я уверен, что вы освоите работу с объектами и указателями в нет времени.