- C语言编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整型提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof 运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策语句
- C语言 - 决策语句
- C语言 - if 语句
- C语言 - if...else 语句
- C语言 - 嵌套 if 语句
- C语言 - switch 语句
- C语言 - 嵌套 switch 语句
- C语言中的循环
- C语言 - 循环
- C语言 - while 循环
- C语言 - for 循环
- C语言 - do...while 循环
- C语言 - 嵌套循环
- C语言 - 无限循环
- C语言 - break 语句
- C语言 - continue 语句
- C语言 - goto 语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 可变参数函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - 返回语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void 指针
- C语言 - 野指针
- C语言 - 解引用指针
- C语言 - 近指针、远指针和巨型指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的区别
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言中的结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点 (.) 运算符
- C语言 - 枚举 (enum)
- C语言 - 结构体填充和压缩
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入 & 输出
- C语言 - 文件 I/O (文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 编译预处理指令
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static 关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C语言编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言 - 变量
变量只不过是程序可以操作的存储区域的名称。C语言中的每个变量都有一个特定的类型,该类型决定变量内存的大小和布局;可以存储在该内存中的值的范围;以及可以应用于该变量的操作集。
为什么我们在 C 语言中使用变量?
C语言中的变量是用户为计算机内存中某个特定位置分配的名称,该位置是大量可随机访问的位置的集合,每个位置可以容纳单个位。内存中的每个位置都由一个唯一的地址标识,该地址以二进制(或为方便起见使用十六进制)格式表示。
由于通过引用其二进制形式的位置来存储和处理内存中的数据非常麻烦,因此像 C 这样的高级语言允许使用用户定义的名称或变量来标识这些位置。
您可以找到合适的助记符标识符并为其赋值,而不是标识一个空闲内存位置并为其赋值。C编译器将选择一个合适的位置并将其绑定到您指定的标识符。
C语言变量的命名约定
变量名必须以字母(大写或小写)或下划线 (_) 开头。它可以包含字母(大写或小写)、数字和下划线字符。C语言中的变量名不能包含其他字符。
C语言中的变量名区分大小写。例如,“age”与“AGE”不同。
ANSI 标准认可变量名长度为 31 个字符。尽管您可以选择具有更多字符的名称,但只识别前 31 个字符。使用描述性变量名来反映其意图存储的值被认为是一种良好的实践。避免使用可能导致混淆的非常短的变量名。
C 是一种静态类型语言。因此,必须在变量名称之前声明变量的数据类型。变量可以在函数内(局部变量)或全局声明。可以在单个语句中声明多个相同类型的变量。
示例
根据上述规则和约定,以下是一些有效和无效的变量名
int _num = 5; // valid integer variable float marks = 55.50; // valid float variable char choice = '0'; // valid char variable // invalid variable name // cannot use "-" int sub-1 = 35; //invalid; must have data type avg = 50; // invalid; name can be used for // declaration only once in a function int choice = 0; // Valid integer name int sal_of_employee = 20000; // Valid because all are of same type int phy, che, maths; // error because variables of // different types in same statement int sal, float tax;
在 C 语言中,变量可以存储属于其识别的任何类型的数据。因此,变量的类型数量与C语言中的数据类型数量一样多。
序号 | 类型和描述 |
---|---|
1 | char 通常是一个八位字节(一个字节)。它是一种整数类型。 |
2 | int 机器最自然的整数大小。 |
3 | float 单精度浮点值。 |
4 | double 双精度浮点值。 |
5 | void 表示类型缺失。 |
C编程语言还允许定义各种其他类型的变量,例如枚举类型、指针类型、数组类型、结构体类型、联合体类型等。在本节中,我们只学习基本变量类型。
C语言中的变量定义
变量定义告诉编译器在哪里以及为变量创建多少存储空间。变量定义指定数据类型,并包含一个或多个该类型变量的列表,如下所示:
type variable_list;
这里,type必须是有效的 C 数据类型,包括 char、w_char、int、float、double、bool 或任何用户定义的对象;variable_list可以包含一个或多个用逗号分隔的标识符名称。
这里显示了一些有效的变量声明:
int i, j, k; char c, ch; float f, salary; double d;
语句int i, j, k;声明并定义变量 i、j 和 k;这指示编译器创建名为 i、j 和 k 的类型为int的变量。
可以在变量声明中初始化(分配初始值)变量。初始化器由等号后跟一个常量表达式组成,如下所示:
type variable_name = value;
示例:变量定义和初始化
请看以下示例
// declaration of d and f extern int d = 3, f = 5; // definition and initializing d and f int d = 3, f = 5; // definition and initializes z byte z = 22; // the variable x has the value 'x' char x = 'x';
对于没有初始化器的定义:具有静态存储期的变量隐式初始化为 NULL(所有字节的值均为 0);所有其他变量的初始值未定义。
C语言中的变量声明
根据 ANSI C 标准,所有变量都必须在开头声明。不允许在第一个处理语句之后声明变量。尽管 C99 和 C11 标准修订已删除此规定,但它仍然被认为是一种良好的编程习惯。您可以声明一个变量以便稍后在代码中为其赋值,或者您可以在声明时初始化它。
示例:变量声明
// declaration with initialization int x = 10; // declare first and assign later int y; y = 20; // define and initialize two variables int d = 3, f = 5; // the variable x has the value 'x' char x = 'x';
一旦声明了某种类型的变量,就不能为其分配任何其他类型的变量值。在这种情况下,C编译器将报告类型不匹配错误。
变量声明向编译器保证存在具有给定类型和名称的变量,以便编译器可以在无需有关变量的完整详细信息的情况下继续进行进一步的编译。变量定义仅在编译时具有其含义,编译器在链接程序时需要实际的变量定义。
当您使用多个文件并在其中一个文件中定义变量时,变量声明很有用,这些变量在链接程序时可用。您将使用关键字“extern”在任何地方声明变量。尽管您可以在 C 程序中多次声明变量,但它只能在一个文件中、一个函数中或一段代码中定义一次。
示例
尝试以下示例,其中变量已在顶部声明,但已在 main 函数内定义和初始化:
#include <stdio.h> // Variable declaration: extern int a, b; extern int c; extern float f; int main () { /* variable definition: */ int a, b; int c; float f; /* actual initialization */ a = 10; b = 20; c = a + b; printf("value of c : %d \n", c); f = 70.0/3.0; printf("value of f : %f \n", f); return 0; }
输出
编译并执行上述代码后,会产生以下结果
value of c : 30 value of f : 23.333334
同样的概念也适用于函数声明,在声明函数时提供函数名,其实际定义可以在其他任何地方给出。例如:
// function declaration int func(); int main() { // function call int i = func(); } // function definition int func() { return 0; }
C语言中的左值和右值
C语言中有两种表达式
- 左值表达式
- 右值表达式
C语言中的左值表达式
引用内存位置的表达式称为“左值”表达式。左值可以出现在赋值运算符的左侧或右侧。
C语言中的变量是左值,因此它们可以出现在赋值运算符的左侧。
C语言中的右值表达式
术语“右值”指的是存储在内存某个地址处的数据值。“右值”是一个不能为其赋值的表达式,这意味着右值可以出现在赋值运算符的右侧,但不能出现在左侧。
数字字面量是右值,因此它们不能被赋值,也不能出现在左侧。
让我们看一下以下有效和无效的语句
// valid statement int g = 20; // invalid statement // it would generate compile-time error 10 = 20;
C语言中的变量可以根据以下参数进行分类
数据类型 - int、float、char 或 struct 类型。
作用域 - 全局变量或局部变量。
存储类型 - 自动、静态、寄存器或外部。
我们将在本教程的后面学习局部和全局类型以及存储类型。