C Переменная
Переменные — это фактически просто имена для областей хранения, с которыми может работать программа. В C каждая переменная имеет определённый тип, который определяет размер и расположение памяти переменной. Значения в этом диапазоне могут храниться в памяти, и к переменной могут применяться операторы.
Имена переменных могут состоять из букв, цифр и символов подчёркивания. Они должны начинаться с буквы или подчёркивания. Прописные и строчные буквы различаются, поскольку C чувствителен к регистру. Основываясь на базовых типах, описанных в предыдущей главе, существуют следующие базовые типы переменных:
| Type | Описание |
|---|---|
| char | Обычно один байт (восемь бит). Это целочисленный тип. |
| int | Целое число, 4 байта, диапазон значений от -2147483648 до 2147483647. |
| float | Значение с плавающей запятой одинарной точности. Одинарная точность имеет формат: 1 бит знака, 8 бит экспоненты и 23 бита дробной части.
|
| double | Значение с плавающей запятой двойной точности. Двойная точность имеет 1 бит знака, 11 бит экспоненты и 52 бита дробной части.
|
| void | Указывает на отсутствие типа. |
Язык C также позволяет определять различные другие типы переменных, такие как перечисления, указатели, массивы, структуры, объединения и так далее. Они будут объяснены в следующих главах. В этой главе мы сначала рассмотрим базовые типы переменных.
Определения переменных в C
Определение переменной сообщает компилятору, где и как создать хранилище для переменной. Определение переменной задаёт тип данных и содержит список одной или нескольких переменных этого типа, как показано ниже:
type variable_list;
typeУказывает тип данных переменной. Он может быть целым числом, числом с плавающей запятой, символом, указателем и т.д., а также может быть пользовательским объектом.
variable_listМожет состоять из одного или нескольких имён переменных, при этом несколько переменных разделяются запятыми.,Разделяются. Переменные состоят из букв, цифр и знаков подчёркивания и начинаются с буквы или знака подчёркивания.
Ниже приведены несколько допустимых объявлений:
Определение целочисленной переменной:
int age;
В приведённом выше коде переменная age определена как целочисленная переменная.
Определите переменную с плавающей запятой:
float salary;
В приведённом выше коде переменная salary определена как переменная с плавающей запятой.
Определите символьную переменную:
char grade;
В приведённом выше коде переменная grade определена как символьная переменная.
Определите переменную-указатель:
int *ptr;
В приведённом выше коде переменная ptr определена как указатель на целое.
Определите несколько переменных:
int i, j, k;
int i, j, k;Объявлены и определены переменныеi, j и k, что указывает компилятору создать переменную типаintс именемi、j、kпеременной.
Инициализация переменной
В языке C инициализация переменной — это присваивание переменной начального значения одновременно с её определением. Инициализацию переменной можно выполнить во время определения или в последующем коде.
Инициализатор состоит из знака равенства, за которым следует константное выражение, как показано ниже:
type variable_name = value;
где,typeуказывает тип данных переменной,variable_name— имя переменной,valueявляется начальным значением переменной.
Вот несколько примеров:
int x = 10; // 整型变量 x 初始化为 10 float pi = 3.14; // 浮点型变量 pi 初始化为 3.14 char ch = 'A'; // 字符型变量 ch 初始化为字符 'A' int d = 3, f = 5; // 定义并初始化 d 和 f byte z = 22; // 定义并初始化 z // 声明外部变量 extern int d; extern int f;
Чтобы инициализировать переменную позже:
В коде после определения переменной можно использовать оператор присваивания.=Присвойте переменной новое значение.
type variable_name; // 变量定义 variable_name = new_value; // 变量初始化
Пример ниже:
int x; // 整型变量x定义 x = 20; // 变量x初始化为20 float pi; // 浮点型变量pi定义 pi = 3.14159; // 变量pi初始化为3.14159 char ch; // 字符型变量ch定义 ch = 'B'; // 变量ch初始化为字符'B'
Обратите внимание, что переменные следует инициализировать перед использованием. Значение неинициализированной переменной не определено и может содержать произвольные мусорные значения. Поэтому во избежание неопределённого поведения и ошибок рекомендуется инициализировать переменные перед их использованием.
Переменная не инициализирована
В языке C, если переменная не инициализирована явно, её значение по умолчанию зависит от типа переменной и её области видимости.
Для глобальных переменных и статических переменных (статических переменных, определённых внутри функций, и глобальных переменных, определённых вне функций), их начальное значение по умолчанию равно нулю.
Ниже приведены значения по умолчанию для различных типов переменных, когда они не инициализированы явно:
- Целочисленные переменные (int, short, long и т. д.): значение по умолчанию — 0.
- Переменные с плавающей запятой (float, double и т. д.): значение по умолчанию — 0.0.
- Символьная переменная (char): значение по умолчанию — '\0', то есть нулевой символ.
- Переменная-указатель: значение по умолчанию — NULL, что означает, что указатель не указывает ни на какой допустимый адрес памяти.
- Переменные составных типов, таких как массивы, структуры и объединения: их элементы или члены будут инициализированы по умолчанию в соответствии с соответствующими правилами, что может включать рекурсивное применение правил по умолчанию к элементам.
Обратите внимание, что локальные переменные (нестатические переменные, определённые внутри функций) не инициализируются автоматически значениями по умолчанию; их начальные значения не определены (содержат мусорные значения). Поэтому перед использованием локальной переменной следует явно присвоить ей начальное значение.
В итоге, значение по умолчанию переменной в C зависит от её типа и области видимости. Значение по умолчанию для глобальных переменных и статических переменных —0, значение по умолчанию символьной переменной —\0, значение по умолчанию для переменных-указателей — NULL, а локальные переменные не имеют значения по умолчанию; их начальные значения не определены.
Объявления переменных в C
Объявление переменной заверяет компилятор, что переменная существует с указанным типом и именем, чтобы компилятор мог продолжить дальнейшую компиляцию, не нуждаясь в знании всех деталей переменной. Объявление переменной имеет смысл только во время компиляции; при компоновке программы компилятору требуется фактическое объявление переменной.
Существует два случая объявлений переменных:
- 1. Один вид требует создания пространства для хранения. Например:int aПространство для хранения уже создано в момент объявления.
- 2. Другой вид не требует создания пространства для хранения: с помощью ключевого слова extern объявляется имя переменной без её определения. Например:extern int aгде переменныеaмогут быть определены в другом файле.
Если только не присутствует ключевое словоextern; иначе все они являются определениями переменных.
extern int i; //声明,不是定义 int i; //声明,也是定义
Подробнее об extern см.:ключевое слово extern в C。
Пример
Попробуйте следующий пример, где переменные объявлены вверху, но определены и инициализированы в функции main:
Пример
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
result 为: 3
Если вам нужно сослаться на переменную, определённую в другом исходном файле, достаточно добавить объявление с ключевым словом extern для этой переменной в файле, который на неё ссылается.
Код файла addtwonum.c:
Код файла test.c:
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
$ gcc addtwonum.c test.c -o main $ ./main result 为: 3
Lvalue и Rvalue в C
В C есть два типа выражений:
- lvalue:Выражение, которое указывает на ячейку памяти, называется lvalue-выражением. lvalue может находиться как слева, так и справа от оператора присваивания.
- rvalue:Термин rvalue обозначает значение, хранящееся по некоторому адресу в памяти. rvalue — это выражение, которому нельзя присвоить значение; то есть rvalue может находиться справа от оператора присваивания, но не может находиться слева.
Переменные являются lvalue, поэтому они могут находиться слева от оператора присваивания. Числовые литералы являются rvalue, поэтому им нельзя присвоить значение, и они не могут находиться слева от оператора присваивания. Следующий оператор является допустимым:
int g = 20;
Но следующая инструкция не является допустимой и вызовет ошибку времени компиляции:
10 = 20;Другие расширения

