Старт в программировании на C: Синтаксис.
Как и в любом другом языке, в Си существуют определённые синтаксические правила и нормы. Для полного понимания процесса следует учесть, что сначала ваш исходный код обрабатывается препроцессором, а затем передаётся компилятору, который также обрабатывает код, после чего начинается компиляция в исполняемый (exe) файл.
Препроцессор в Си удаляет комментарии из исходного кода, преобразует строки в соответствии с макросами и обрабатывает директивы, начинающиеся с символа «#».
Теперь рассмотрим следующий код:
int test = 0;
#include "lib.h"
#define MAX(a,b) (a>b?a:b)
#define L 10
int main(int argc, char **argv)
{
int a = MAX(L,-4);
// comment
return 0;
}После того как препроцессор выполнит все преобразования, компилятор получит следующий код на вход:
int test = 0;
int main(int argc, char **argv)
{
int a = (10 > -4?10:-4);
return 0;
}Директива `#include` сообщает препроцессору, что необходимо вставить содержимое указанного файла на место этой директивы.
Директива `#define` в этом контексте создает макрос, который можно рассматривать как шаблон. Здесь `a` и `b` - это аргументы шаблона, которые заменяются на соответствующие значения в выражении '(a > b ? a : b)'. В качестве аргумента 'a' была передана строка '10', а 'b' - строка '-4'. Важно отметить, что макросы не выполняют операции с числами или подобными значениями; они просто заменяют одну строку на другую с небольшой логикой. Если бы вместо числа '10' мы указали строку "one", препроцессор успешно завершил бы свою задачу и передал компилятору код с "one" вместо '10', после чего компилятор выдал бы ошибку.
Кроме того, директива '#define' может использоваться для создания константных выражений. В данном случае, все вхождения строки "L" в последующем коде будут заменены на "10". И опять-таки, препроцессору не важен формат указания значения; его задача состоит в замене одной строки на другую.
Давайте рассмотрим синтаксис самого языка Си:
int test = 0;
В этой строке создается переменная с именем `test`, и она инициализируется значением `0`.
В языке Си переменные объявляются в следующем формате:
тип_данных имя_переменной;
Однако можно сразу же присвоить значение переменной, добавив после ее названия символ `=` и само значение.
Символ `;` обозначает конец инструкции. В отличие от Python, в Си команды не разделяются по строкам. Вы можете написать весь код в одной строке, просто проставив символ `;` между инструкциями. В теории код можно записать в одну строку без переносов, например:
int test = 0;int main(int argc, char **argv){int a = (10 > -4?10:-4);return 0;}Тем не менее, использование переносов строк и отступов считается хорошей практикой при написании кода.
int main(int argc, char **argv)
Эта строчка объявляет функцию с именем `main`, которая имеет тип возврата `int`. Указание типа функции определяет, какое значение она обязана возвращать. В данном случае функция `main` должна возвращать целое число (`int`). Кроме того, эта функция принимает два аргумента, для которых тоже определены типы. Мы можем использовать эти аргументы в теле функции.
{
}Фигурные скобки в языке C обозначают, что код между ними является единым блоком. Это четко показывает начало и конец блока операций. В данном случае мы объединили две операции в один блок, чтобы функция могла правильно интерпретировать, какие операции ей принадлежат. Все, что находится вне этих скобок, не относится к функции `main`.
int a = (10 > -4 ? 10 : -4);
В этой строке мы объявляем локальную переменную типа `int` с именем `a` и присваиваем ей значение, которое является большим из 10 и -4. Используется условный тернарный оператор.
Синтаксис условия выглядит так: `условие ? операция A : операция B`.
Если условие истинно, выполняется операция A, если ложно — операция B.
Таким образом, если `10 > -4`, результатом будет 10, иначе -4.
Следовательно, переменной `a` будет присвоено значение 10.
Эта строка является выражением и должна завершаться с помощью символа `;`.
return 0;
Оператор `return` завершает выполнение функции и возвращает определенное значение. Как упоминалось ранее, функция должна возвращать значение указанного типа. В данном случае функция `main` завершится и вернет значение 0. Эта строка также является выражением и должна заканчиваться символом `;`.