Приглядимся ближе к нашей первой программе и попробуем сделать обобщение. Программа имеет следующую структуру:

directives

int main (void)
{
	statements
}

Си в основном состоит из аббревиатур и специальных символов, поэтому код, написанный на Си краток.

Обратная сторона медали этой краткости - код может выглядеть очень загадочно. Например, символ { следует читать как начало функции main(), а символ }, как конец этой функции.

Си позволяет зайти еще дальше. В 1990 году на конкурсе был представлен код, который решает задачу о восьми ферзях Программа способна справиться с любым количеством ферзей от 4 до 99:

#include <stdio.h>
 
v,i,j,k,l,s,a[99];
 
main()
 
{
 
for(scanf("%d",&s);*a-s;v=a[j*=v]-a[i],k=i<s,j+=(v=j<s&&(!k&&!!printf(2+"\n\n%c"-(!l<<!j)," #Q"[l^v?(l^j)&1:2])&&++l||a[i]<s&&v&&v-i+j&&v+i-j))&&!(l%=s),v||(i==j?a[i+=k]=0:++a[i])>=s*k&&++a[--i])
 
;
 
}

Легенда гласит, что создатели языка вынуждены были использовать телетайп для ввода программы, скорость которого была невысока и составляла около 10 символов в секунду. Минимизация текста программы позволяла ускорить процесс.

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

Ключевые возможности

Даже простая программа из нашего примера задействует три ключевые возможности языка:

  • директивы directives (модифицируют текст программы перед компиляцией)
  • функции functions (именованные блоки кода, как функция main() в примере выше)
  • высказывания statements (команды для выполнения)

Рассмотрим каждую из этих возможностей ближе.

2.2.1 Директивы

2.2.2 Функции