September 7, 2024

Старт в программировании на C: Синтаксис.

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

Препроцессор в Си удаляет комментарии из исходного кода, преобразует строки в соответствии с макросами и обрабатывает директивы, начинающиеся с символа «#».

Теперь рассмотрим следующий код:

lib.h

int test = 0;

main.c

#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. Эта строка также является выражением и должна заканчиваться символом `;`.