Знание основных языков программирования, языка C (I)

Язык программирования C
Знание основных языков программирования, языка C (I)

предисловие

Что касается языков программирования, мы часто видим, как люди дерутся друг с другом из-за языковых лагерей, которые они поддерживают, На самом деле это вовсе не обязательно, это просто инструмент. Когда используется большинство основных языков, у вас может не быть никаких предубеждений Суть - это просто задача, используемая для описания компьютера, но фокус дизайна каждого языка разный. Лучше всего не спорить на уровне языка, а уделить время принципам и структурам компьютерной реализации, чтобы вы могли лучше понять, что каждая строчка языка программирования описывает в компьютере. В этой серии будут обобщены соответствующие знания о тех языках программирования, которые сейчас широко используются в сфере ИТ.

О языке C

Язык C является наиболее классическим языком, и операционная среда многих других языков также написана на C. Люди, которые пишут программы, не могут понять язык C! Упоминание C неизбежно приведет к тому, что люди будут ассоциироваться с указателями.Указатели, которые сбивали вас с толку в колледже, были основой безграничной мощи языка C. Языку C может не хватать высокоуровневого дизайна и эффективности написания, но он достаточно классический и прост в управлении нижним уровнем. Указатели, хотя и рискованны, но эффективны. Кроме того, ANSI C также упрощает миграцию программ C в другие операционные системы.Некоторые базовые знания языка C перечислены ниже.

C语言

этап перевода

Написанная программа на C должна быть скомпилирована в исполняемые машинные инструкции, прежде чем ее можно будет запустить, что является работой по переводу. Основными этапами трансляции являются компиляция и компоновка. Компиляция — это исходный код в объектный код, а компоновка — это компоновка каждого объектного файла для формирования исполняемой программы. Конечно, компоновщик также представит все стандартные библиотеки функций C, используемые программой. Функция. Иногда процесс компиляции также использует предварительную обработку в качестве этапа, который в основном выполняет некоторую обработку исходного файла, такую ​​как замена #define фактическими значениями и заполнение содержимого файла, указанного #include. Ниже приведен пример использования gcc для компиляции и компоновки.После компиляции и компоновки получается исполняемая программа.Эти два шага выполняет gcc.Командаgcc hello.c -o hello, в конечном итоге запуск ./hello выведет «hello world».

#include<stdio.h>

int main()
{
    printf("hello world");
}

编译链接

Если мы напишем несколько файлов c, компилятор скомпилирует их в несколько объектных файлов obj, а затем свяжет все объектные файлы через компоновщик для создания исполняемого файла.

О расширениях

Обратите внимание, что расширение целевого файла в системе Windows — obj, которое не будет удалено после того, как ссылка будет завершена. Целевое расширение файла unix-подобной системы — o, которое обычно удаляется после завершения ссылки. Исполняемый файл системы Windows имеет расширение exe, в то время как имя исполняемого файла unix-подобной системы может быть произвольным. Кроме того, суффикс исходных файлов на языке C обычно равен c, а суффикс файлов заголовков — h. Хотя обязательных требований нет, все будут соблюдать это соглашение.

О компиляторе

Этап перевода должен превратить код языка C в исполняемую программу, что выполняется компилятором C. Существует также много компиляторов C, наиболее распространенными из них являются следующие:

  • GCC, GCC (GNU Compiler Collection, GNU Compiler Suite), бесплатное программное обеспечение компилятора под лицензией GPL, разработанное GNU. Он начинался как компилятор языка C, но позже превратился в компиляторы различных языков, таких как C, C++, Java, Android, Objective-C и Fortran и т. д. Многие Unix-подобные операционные системы теперь поставляются с GCC в качестве стандартного компилятора.
  • MS C, выпущенный вместе с Microsoft Visual Studio, представляет собой полную интегрированную среду разработки, предоставляемую Microsoft, которая после компиляции может работать во всех операционных системах Microsoft. Например, VS обычно использует компилятор CL.
  • Clang — облегченный компилятор C/C++/Objective-C на основе LLVM, обычно используемый в системах Mac.
  • Turbo C, относительно популярный компилятор C, небольшой и быстрый.
  • cc, компилятор C, является древним компилятором для Unix-систем, и многие классические книги увидят этот компилятор. Для обеспечения совместимости текущая система Linux будет указывать cc на gcc как символическую ссылку, т.е. /usr/bin/cc -> gcc.

пример компиляции gcc

Возьмите gcc системы linux в качестве примера, чтобы увидеть несколько примеров компиляции. Если код hello.c выглядит следующим образом,

#include<stdio.h>

int main()
{
    printf("hello world");
}

Мы напрямую используем следующую команду gcc для ее компиляции без каких-либо параметров.В это время будет создан исполняемый файл с именем out.a через./a.outСпособен выводить «привет, мир».

gcc hello.c

Если добавить две пары заголовочных файлов и исходных файлов, name.h/name.c и adder.h/adder.c, и немного изменить hello.c, коды трех файлов будут следующими.

//name.h
char* get_name();

//name.c
char* get_name() {
	char* name = "seaboat : ";
	return name;
}
//adder.h
int add(int a, int b);

//adder.c
int add(int a, int b) {
	return (a + b);
}
//hello.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include"adder.h"
#include"name.h"
int main()
{
	char* name = get_name();
	char* hello = "hello world";
	char* output = (char*)malloc(strlen(hello) + strlen(name));
	sprintf(output, "%s%s", name, hello);
	printf("%s\n", output);
	int a = 1;
	int b = 3;
	printf("a + b = %d\n", add(a, b));
}

Затем вы можете скомпилировать и связать несколько исходных файлов с помощью следующих команд и, наконец, сгенерировать исполняемый файл с именем a.out. Когда мы запускаем исполняемый файл через ./a.out, он выводит «seaboat: hello world a + b = 4».

gcc name.c adder.c hello.c

Мы также можем сгенерировать объектные файлы, скомпилировав два файла, name.c и adder.c, с помощью следующих двух команд, adder.o и name.o соответственно. Затем скомпилируйте исходный файл hello.c с помощью третьей строки команд ниже.После компиляции он автоматически свяжется с двумя объектными файлами, name.o и adder.o.

gcc -c adder.c
gcc -c name.c
gcc name.o adder.o hello.c

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

gcc -c  name.c adder.c hello.c

Для нескольких объектных файлов, если вы хотите связать их, вы можете использовать следующую команду для создания исполняемого файла.

gcc  name.o adder.o hello.o

Если мы хотим назвать сгенерированный исполняемый файл, мы можем сделать это с помощью следующей первой строки команды, которая сгенерирует исполняемый файл с именем hello. Точно так же вы также можете указать имя исполняемого файла при подключении нескольких объектных файлов.Как показано во второй строке следующей команды, будет создан исполняемый файл с именем hello2.

gcc name.c adder.c hello.c -o hello

gcc  name.o adder.o hello.o -o hello2

О наборах символов

При написании на языке C исходный код может включать следующие наборы символов:

  1. английские прописные и строчные буквы
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
  1. десятичные арабские цифры
0 1 2 3 4 5 6 7 8 9
  1. другие символы
! " # % & ' () * + , - . / :
; < = > ? [ ] \ ^ _ { } | ~
  1. пробел
空格、水平制表符、垂直制表符、换行、换页

Об аннотациях

Существует два типа комментариев, предоставляемых языком C:/*начать с*/конец, чтобы прокомментировать несколько строк кода, заканчивающихся//Начните комментировать отдельные строки кода. Вообще говоря, комментарии в исходном коде означают, что они будут очищены препроцессором во время компиляции и заменены пробелами.

/*
第一种注释方式
*/

//第二种注释方式

Об идентификаторах и ключевых словах

Идентификаторы — это имена наших разработчиков для переменных, функций, типов, структур, макросов и т. д. Язык C также требует, чтобы мы давали имена в соответствии с его правилами. Согласно правилам, идентификаторы могут состоять из английских прописных и строчных букв (A~Z, a~z), арабских цифр (0~9) и нижнего подчеркивания (_). Необходимо отметить следующие моменты:

  • Требования не могут начинаться с буквы.
  • Язык Си чувствителен к регистру.
  • Язык C не ограничивает длину идентификатора, но стандарт позволяет компилятору игнорировать символы после 31-го бита.Конкретное количество битов до перехвата реализуется разными компиляторами.Когда перехватываемые строки одинаковы, они считаются одним и тем же идентификатором.
  • Идентификаторы не должны называться случайным образом, и постарайтесь, чтобы имена идентификаторов имели соответствующие значения.

Конечно, язык C также резервирует 32 специальных ключевых слова, и идентификаторы, которые мы называем, не могут совпадать с ними, иначе будет сообщено об ошибке. Вот 32 ключевых слова:

ключевые слова иллюстрировать
auto объявить автоматические переменные
break вырваться из текущей петли
case ветвь инструкции switch
char Объявите символьную переменную или функцию
const Объявить переменную только для чтения
continue Завершить текущий цикл и начать следующий цикл
default ветвь "по умолчанию" в операторе switch
do Тело цикла оператора цикла
double Объявите переменную или функцию двойной точности
else Ветвь отрицания условного оператора (используется с if)
enum объявить тип перечисления
extern Объявление переменной или функции объявлено в другом файле
float Объявите переменную или функцию с плавающей запятой
for оператор цикла
goto оператор безусловного перехода
if Условные операторы
int Объявить целочисленную переменную или функцию
long Объявите длинную переменную или функцию
register объявить регистровую переменную
return Оператор возврата подпрограммы (с параметрами или без них)
short объявить короткую переменную или функцию
signed Объявление переменной или функции знакового типа
sizeof Вычислить тип данных или переменную длину (октеты)
static объявить статические переменные
struct Объявить структурную переменную или функцию
switch для операторов switch
typedef Используется для псевдонимов типов данных
unsigned объявить переменную или функцию беззнакового типа
union объявить тип объединения
void Объявить функцию без возвращаемого значения или параметров, объявить нетипизированный указатель
volatile Указывает, что переменные могут быть неявно изменены во время выполнения программы.
while Условие цикла оператора цикла

Об авторе: псевдоним мореход, хорошо разбирается в искусственном интеллекте, информатике, математических принципах, базовых алгоритмах. Книги: "Анализ дизайна ядра Tomcat", "Структура графических данных и алгоритм", "Популяризация принципов искусственного интеллекта".

Сосредоточьтесь на искусственном интеллекте, чтении и мышлении, расскажите о математике, информатике, распределенных технологиях, машинном обучении, глубоком обучении, обработке естественного языка, алгоритмах и структурах данных, глубине Java, ядре Tomcat и т. д.