Приглядимся ближе к нашей первой программе и попробуем сделать обобщение. Программа имеет следующую структуру:
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
(команды для выполнения)
Рассмотрим каждую из этих возможностей ближе.