предисловие
Что касается языков программирования, мы часто видим, как люди дерутся друг с другом из-за языковых лагерей, которые они поддерживают, На самом деле это вовсе не обязательно, это просто инструмент. Когда используется большинство основных языков, у вас может не быть никаких предубеждений Суть - это просто задача, используемая для описания компьютера, но фокус дизайна каждого языка разный. Лучше всего не спорить на уровне языка, а уделить время принципам и структурам компьютерной реализации, чтобы вы могли лучше понять, что каждая строчка языка программирования описывает в компьютере. В этой серии будут обобщены соответствующие знания о тех языках программирования, которые сейчас широко используются в сфере ИТ.
О языке C
Язык C является наиболее классическим языком, и операционная среда многих других языков также написана на C. Люди, которые пишут программы, не могут понять язык C! Упоминание C неизбежно приведет к тому, что люди будут ассоциироваться с указателями.Указатели, которые сбивали вас с толку в колледже, были основой безграничной мощи языка C. Языку C может не хватать высокоуровневого дизайна и эффективности написания, но он достаточно классический и прост в управлении нижним уровнем. Указатели, хотя и рискованны, но эффективны. Кроме того, ANSI 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 исходный код может включать следующие наборы символов:
- английские прописные и строчные буквы
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
- десятичные арабские цифры
0 1 2 3 4 5 6 7 8 9
- другие символы
! " # % & ' () * + , - . / :
; < = > ? [ ] \ ^ _ { } | ~
- пробел
空格、水平制表符、垂直制表符、换行、换页
Об аннотациях
Существует два типа комментариев, предоставляемых языком 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 и т. д.