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 - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 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 - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 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; // 有效的整数变量
float marks = 55.50; // 有效的浮点变量
char choice = '0'; // 有效的字符变量

// 无效的变量名
// 不能使用"-"
int sub-1 = 35;

// 无效;必须具有数据类型
avg = 50;

// 无效;名称只能用于
// 在函数中声明一次
int choice = 0;

// 有效的整数名称
int sal_of_employee = 20000;

// 有效,因为所有变量都是相同类型
int phy, che, maths;

// 错误,因为同一语句中的变量
// 类型不同
int sal, float tax;

在 C 语言中,变量可以存储其可识别的任何类型的数据。因此,变量的类型数量与 C 语言中的数据类型的数量相同。

序号 类型和描述
1

char

通常为一个八位字节(一个字节)。它是整数类型。

2

int

机器最自然的整数大小。

3

float

单精度浮点值。

4

double

双精度浮点值。

5

void

表示不存在类型。

C 编程语言还允许定义各种其他类型的变量,例如枚举类型、指针类型、数组类型、结构体类型、联合类型等。本章仅学习基本变量类型。

C 语言中的变量定义

变量定义会告诉编译器在何处以及为变量创建多少存储空间。变量定义指定一种数据类型,并包含该类型的一个或多个变量列表,如下所示:-

type 变量列表;

其中,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;

示例:变量定义和初始化

请看以下示例:

// 声明 d 和 f
extern int d = 3, f = 5;

// 定义并初始化 d 和 f
int d = 3, f = 5;

// 定义并初始化 z
byte z = 22;

// 变量 x 的值为 'x'
char x = 'x';               

对于没有初始化器的定义:具有静态存储期的变量隐式初始化为 NULL(所有字节的值均为 0);所有其他变量的初始值均未定义。

C 语言中的变量声明

根据 ANSI C 标准,所有变量必须在开头声明。不允许在第一个处理语句之后声明变量。虽然 C99 和 C11 标准修订版已取消此规定,但这仍然被认为是一种良好的编程习惯。您可以声明一个变量,并在代码的后续部分赋值,也可以在声明时初始化它。

示例:变量声明

// 带初始化的声明
int x = 10;

// 先声明后赋值
int y;
y = 20;

// 定义并初始化两个变量
int d = 3, f = 5;

// 变量 x 的值为 'x'
char x = 'x';

一旦声明了特定类型的变量,就不能再赋值给其他类型的变量。在这种情况下,C 编译器 会报告类型不匹配错误。

变量声明可以确保编译器存在具有给定类型和名称的变量,这样编译器就可以继续进行编译,而无需了解变量的完整信息。变量定义仅在编译时才有意义,编译器在链接程序时需要实际的变量定义。

当您使用多个文件,并且在链接程序时可用的其中一个文件中定义变量时,变量声明非常有用。您可以使用关键字"extern"在任何地方声明变量。虽然你可以在 C 程序中多次声明一个变量,但它在一个文件、函数或代码块中只能定义一次。

示例

尝试以下示例,其中变量在顶部声明,但在主函数内部定义和初始化 -

#include <stdio.h>

// 变量声明:
extern int a, b;
extern int c;
extern float f;

int main () {

   /* 变量定义: */
   int a, b;
   int c;
   float f;
 
   /* 实际初始化 */
   a = 10;
   b = 20;
  
   c = a + b;
   printf("value of c : %d 
", c);

   f = 70.0/3.0;
   printf("value of f : %f 
", f);
 
   return 0;
}

输出

上述代码编译执行后,结果如下:

value of c : 30
value of f : 23.333334

同样的概念也适用于函数声明,即在声明时提供函数名称,而其实际定义可以在其他任何地方给出。例如:-

// 函数声明
int func();

int main() {

   // function call
   int i = func();
}

// 函数定义
int func() {
    return 0;
}

C 语言中的左值和右值

C 语言中有两种表达式:

  • 左值表达式
  • 右值表达式

C 语言中的左值表达式

引用内存位置的表达式称为"左值"表达式。左值可以出现在赋值语句的左侧或右侧。

C 语言中的变量是左值,因此它们可以出现在赋值语句的左侧。

C 语言中的右值表达式

术语"右值"是指存储在内存中某个地址的数据值。 "右值"是指不能被赋值的表达式,这意味着右值可以出现在赋值语句的右侧,但不能出现在左侧。

数字字面量是右值,因此它们不能被赋值,也不能出现在左侧。

请看以下有效和无效的语句:

// 有效语句
int g = 20;

// 无效语句
// 会产生编译时错误
10 = 20;

C 语言中的变量可根据以下参数进行分类:

  • 数据类型 - int、float、char 或 struct 类型。

  • 作用域 - 全局变量或局部变量。

  • 存储类型 - 自动、静态、寄存器或外部。

我们将在本教程的后面学习局部类型、全局类型以及存储类型。