Язык программирования 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 типа констант
- Целое число
- Настоящий
- Характер
Целое число
- Любые положительные, отрицательные или нулевые значения являются целочисленными константами.
- В целочисленной константе не допускаются специальные символы. (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.
- Любое число может быть передано как символ