Язык программирования C был разработан в Bell Laboratories Деннисом Ритчи в 1972 году. Несмотря на свой возраст, он до сих пор остается одним из самых популярных языков. C был разработан специально для написания операционной системы UNIX. Язык программирования C можно сравнить с английским языком в том, что ключевые слова похожи на слова, а синтаксис похож на грамматику C.

Освоение C требует глубокого понимания каждого оператора, разделителя, ключевого слова и синтаксиса. Начнем с вопроса «что такое программа на C?»

Что такое программа Си?

  • Программа C представляет собой набор одной или нескольких функций, операторов или инструкций.
main()      -> starting of C program
{           -> left or opening bracket 
int a=1;    -> statement terminates with semicolon
}           -> right or closing bracket
  • Каждая программа на C должна иметь одну основную функцию.
  • Функция main() указывает на запуск программы C.
  • Все программы на C заключены в пару фигурных скобок { }.
  • Каждый оператор в программе C заканчивается точкой с запятой.
  • C чувствителен к регистру. main и MAIN не совпадают в языке C.
main  (
	)
{
                 }
  • Приведенный выше код является примером неправильного отступа. Но все равно программа будет успешно скомпилирована, потому что язык C не учитывает отступы.

💡 Компилятор — это программное обеспечение, которое преобразует программы C в двоичный язык.

  • Между двумя буквами одного и того же слова или лексемы не должно быть пробела, но допустим пробел между 2 лексемами.

💡 Наименьшая индивидуальная единица называется токеном. Между двумя токенами может быть любое количество пробелов, новых строк или табуляций.

Константы

Есть 3 типа констант

  1. Целое число
  2. Настоящий
  3. Характер

Целое число

  • Любые положительные, отрицательные или нулевые значения являются целочисленными константами.
  • В целочисленной константе не допускаются специальные символы. (5000, 5%)
  • Для целочисленной константы единицы измерения не записываются. (10 см, 5 кг)
  • В целочисленной константе не допускается пробел. (5 000, 12 000)
  • Если знак не указан, будет учитываться знак + по умолчанию. +5 и 5 одинаковые.
  • Чтобы присвоить значения со знаком, вы можете использовать унарные + и унарные -. (+5, -5)
  • Пример: 5000, -8, 0

Настоящее или плавающее

  • Любое число, представленное десятичной точкой, называется вещественной константой.
  • У вас может быть знак перед реальной константой (+5,2, -0,5).
  • Для реальной константы не допускается использование единиц измерения (10,2 см, 5,2 кг).
  • Пример: 5,2, -3,6

💡 В языке C целые числа, такие как 75 и 3, называются десятичными, а десятичные числа, такие как 1,2 и 3,6, называются действительными значениями.

Персонаж

  • Любое содержимое, заключенное в одинарную кавычку («а»), называется символьной константой.
  • Для символьных констант не допускаются единицы измерения.
  • Для символьной константы допускается только один символ. Например, «ABC», «-3» и «3,5» не являются символьными константами.
  • Есть некоторые исключения для специальных символов, таких как «\n» и «\t».
  • Всего в языке C 256 символов. Каждый символ имеет целочисленное значение ASCII.
  • Значение ASCII «\0» равно 0, «0» равно 48, «A» равно 65 и «a» равно 97.
  • Всякий раз, когда мы компилируем программу, компилятор берет значение каждого символа ASCII и преобразует его в 0 и 1.

💡 ASCII — американский стандартный код для обмена информацией

Типы данных

  • int, char и float — ключевые слова, основные типы данных, основные типы данных, основные типы данных.
  • Тип данных используется для выделения некоторых байтов памяти в ОЗУ.
  • Позже мы увидим больше о типах данных.

Переменная

  • Переменная — это имя ячейки памяти.
  • Он используется для хранения данных. Его значение можно изменить, и его можно использовать повторно.
  • Это способ представить местоположение памяти через имена, чтобы его можно было легко идентифицировать.

Правила построения имени переменной

  • Имя переменной должно иметь алфавит или знак подчеркивания (_).
  • Переменная может быть комбинацией букв и цифр.
  • Любое имя функции может быть использовано в качестве имени переменной.
  • Имя переменной может быть ключевым словом с изменяющимся регистром или комбинацией двух или более ключевых слов.
  • Переменная может содержать заглавные буквы.
  • В имени переменной не допускается пробел.
  • Никакие специальные символы, кроме подчеркивания, не допускаются в имени переменной.
  • Имя переменной не должно начинаться с цифры.
//valid variable names 
main(){
int a=1;
int _=2;
int __=3;
int ab2=4; 
int main=5;
int Float=6;
int intfloat=7;
int A=8;
}
//invalid variable names
int ab 2=12;
int r@b=12;
int 3e=12;
  • Вы не должны объявлять одну и ту же переменную несколько раз в одном блоке.
  • Но вы можете присваивать разные значения несколько раз в одном блоке.
//this is possible
int a=5;
a=6;
//this is not possible
int a=5;
int a=6;
  • Рекомендуется использовать имена, относящиеся к значениям, хранящимся в переменной. Приведенная ниже программа является примером.
main(){
int area=0;
int l=3,b=2;
area=l*b;
}

💡 Правила построения имен функций, переменных, меток перехода, структур и перечислений одинаковы.

Спецификаторы формата

  • Спецификаторы формата являются заполнителями.
  • Для печати или сканирования данных требуются спецификаторы формата.
  • Спецификаторы формата определяют формат входных или выходных данных.
  • Спецификаторы формата всегда заключены в строку
  • Спецификатор формата будет обсуждаться более подробно позже.

printf()

syntax:
printf("  ", var1, var2, var3, ...);
printf(" ");
  • В printf первый аргумент должен быть заключен в двойные кавычки.
  • Если у вас более одного аргумента, то каждый аргумент будет разделен запятой (,)
  • В первом аргументе, если у нас есть спецификаторы формата, первый спецификатор формата заменяется вторым аргументом. Второй аргумент заменяется третьим аргументом, а описатель формата n заменяется n+1-м аргументом.
main(){
printf("102030");        //102030
printf("10,20,30");      //10,20,30
printf("10 20 30");      //10  20  30
printf("10\\t20\\t30");    //10    20    30
}

💡 \t печатает пробелы. Количество пробелов зависит от компилятора.

main(){
printf("\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t5\\t\\t7\\n\\n\\t\\t\\t\\t8);
}
/*gives output as
                      5        7
                8
*/
  • Если первый аргумент содержит управляющую последовательность, она будет применена к выходу.
main(){
printf("%d*%d=%d", 5,2,5+2);                     //5*2=7
printf("%d %f %c",10, 2.5, 'A');                 //10 2.5 A
printf("%d %d",10,20,30,40);                     //10 20
printf("%d %d", "%d %d", 10, 20, 30, 40);        //Garbage value 10
printf("A", "b", "c");                           //A
int a1=3.5;
printf("%d",a1);                                  //3
int a2=4.9;
printf("%d",a2);                                  //4
float a3=35;
printf("%f", a3);                                 //35.000000
int a4=35;
printf("%f", a4);                                 //Garbage value
}

💡 Вы можете назначить любой тип данных любому другому типу данных. Компилятор неявно преобразует свой тип данных.

  • Если имеется несоответствие между спецификатором формата и печатаемым значением, то будет напечатано мусорное значение.
printf("%d",6.5);               //Garbage value
printf("%f",5/2);               //Garbage value
printf("%d", 5/2.0);            //Garbage value
printf("%d", 5/-2.0);           //Garbage value
  • Компилятор будет неявно преобразовывать тип данных, если назначен другой тип данных. Для инт а=3,5; компилятор преобразует 3.5 как 3, а a будет равно начальной части, т.е. 3
  • Например,
printf(”%d”,6.5);   //garbage value
printf(”%f”,6);     //garbage value
  • Но мы можем без проблем менять местами символы и целые числа. Например,
printf(”%d”,’?’);  //63
printf(”%c”, 65);   //A
  • Вы не можете присвоить значение с плавающей запятой спецификатору формата символов. Это приведет к мусорному персонажу.
  • Если в операторе печати упоминается только спецификатор формата, а значения не упоминаются, то
  • %d даст целочисленное значение мусора
  • %f даст значение с плавающей запятой мусора
  • %c даст символ мусора
printf("%f", 5>=6);             //Garbage value
printf("%d %f %c", '?',78, 2.5) //63 Garbage value Garbage characters
printf("%f", '#');              //Garbage value
printf("3+2");                  //3+2
printf("%d",3+2);               //5
printf("%d");                   //Garbage value
printf("%c");                   //Garbage character
  • Если количество спецификаторов формата превышает количество переменных или значений, компилятор проигнорирует лишние переменные.
printf("%d %d",10,20,30,40); //10 20
  • printf() возвращает количество символов
  • printf("%d",printf("байты")); напечатает содержимое второго оператора printf, а затем напечатает количество символов во втором операторе printf.
printf("%d",printf(”bytes”));  //bytes5
  • Оператор printf будет выполняться справа налево
printf("%d %d", printf("tony"),printf("rdj"));   //rdjtony4 3

сканф()

  • scanf() используется для сканирования, чтения или сохранения введенных с клавиатуры значений в качестве входных данных.
  • Оператор scanf() является заблокированным оператором.
  • 1-й аргумент должен быть строкой, заключенной в двойные кавычки (" "), и он должен содержать соответствующие спецификаторы формата.
  • Следующие аргументы будут адресами, по которым будут храниться входные значения.
  • Первый аргумент должен сканироваться по адресу второй переменной, а второй спецификатор формата должен сканироваться по адресу 3-й переменной и так далее.
main(){
int a,b;
printf("enter two values");
scanf("%d %d", &a,&b);
a>b?printf("a is max"):printf("b is max");
}
  • Соответствующий спецификатор формата должен быть указан в первом аргументе,
main()
{
    float a;
    int b;
    char c;
    scanf("%f %d",&a,&b); //2  2.5
    printf("%f %d",a,b);  //2.000000 2
}
  • Несоответствие между спецификаторами формата и входными значениями не приведет к ошибке.
  • Когда мы меняем местами числа с плавающей запятой и целое число, компилятор неявно преобразует их.
main()
{
int a;
char c;
scanf("%d %c",&a,&c); //2.5
printf("%d %c",a,c);  //2 .
scanf("%c %d",&c,&a); //22
printf("%c %d",c,a);  //2 2
scanf("%c %d",&c,&a); //2x
printf("%c %d",c,a);  //2 32766
}
  • Когда в приведенной выше программе на вход подается значение с плавающей запятой, компилятор рассматривает «.» как символ и сохраняет «.» в c.
  • Любое число может быть передано как символ