C语言编程基础:类型定义、语句、声明及作用域详解
立即解锁
发布时间: 2025-08-22 00:24:54 阅读量: 3 订阅数: 6 


C语言编程基础与实践
# C语言编程基础:类型定义、语句、声明及作用域详解
## 1. Typedef的使用
Typedef用于定义类型的同义词,而非创建新类型。其声明格式如下:
```c
typedef long Blockno, *Blockptr;
typedef struct { double r, theta; } Complex;
```
上述代码中,`Blockno` 是 `long` 类型的同义词,`Blockptr` 是 `long` 指针类型的同义词,`Complex` 是一个包含 `r` 和 `theta` 两个双精度浮点数成员的结构体类型。
使用示例:
```c
extern Blockptr bp;
extern Blockno;
Blockno b;
Complex z, *zp;
```
这里,`b` 的类型是 `long`,`bp` 是指向 `long` 的指针,`z` 是 `Complex` 结构体类型,`zp` 是指向 `Complex` 结构体的指针。
Typedef名称可以在内部作用域中重新声明,但必须提供非空的类型说明符。例如:
```c
extern int Blockno; // 重新声明 Blockno
```
## 2. 类型等价性
两个类型说明符列表等价的条件是它们包含相同的类型说明符集合,同时要考虑到某些说明符可以由其他说明符隐含(如 `long` 单独使用时隐含 `long int`)。不同标签的结构体、联合体和枚举类型是不同的,无标签的联合体、结构体或枚举类型指定唯一类型。
判断两个类型是否相同,需在展开所有typedef类型并删除所有函数参数说明符后,其抽象声明符在类型说明符列表等价的情况下相同,同时数组大小和函数参数类型也很重要。
## 3. 语句分类
语句主要分为以下几类:
- 标签语句(Labeled Statements)
- 表达式语句(Expression Statements)
- 复合语句(Compound Statements)
- 选择语句(Selection Statements)
- 迭代语句(Iteration Statements)
- 跳转语句(Jump Statements)
### 3.1 标签语句
标签语句的形式如下:
```plaintext
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
```
标识符标签仅用作 `goto` 语句的目标,其作用域是当前函数。标签有自己的命名空间,不会与其他标识符冲突,也不能重新声明。`case` 标签和 `default` 标签用于 `switch` 语句,`case` 的常量表达式必须具有整数类型。
### 3.2 表达式语句
表达式语句的形式为:
```plaintext
expression-statement:
expressionopt;
```
大多数表达式语句是赋值或函数调用。表达式的所有副作用在执行下一条语句之前完成。如果表达式缺失,则称为空语句,常用于为迭代语句提供空体以放置标签。
### 3.3 复合语句
复合语句(也称为块)允许在需要一条语句的地方使用多条语句。函数定义的主体就是一个复合语句,其形式如下:
```plaintext
compound-statement:
{ declaration-listopt statement-listopt }
declaration-list:
declaration
declaration-list declaration
statement-list:
statement
statement-list statement
```
如果声明列表中的标识符在块外部已经有作用域,那么该外部声明在块内暂停,块结束后恢复。同一标识符在同一块内只能声明一次。自动对象的初始化在每次进入块的顶部时执行,按声明符的顺序进行;如果是跳转到块内,则不执行这些初始化。静态对象的初始化在程序开始执行之前仅执行一次。
### 3.4 选择语句
选择语句用于选择多个控制流之一,包括 `if` 语句和 `switch` 语句:
```plaintext
selection-statement:
if (expression) statement
if (expression) statement else statement
switch (expression) statement
```
在 `if` 语句中,表达式必须具有算术或指针类型,计算表达式的值(包括所有副作用),如果表达式的值不等于 0,则执行第一个子语句;在 `if-else` 形式中,如果表达式的值为 0,则执行第二个子语句。`else` 与同一块嵌套级别中最后遇到的无 `else` 的 `if` 关联,以解决 `else` 歧义问题。
`switch` 语句根据表达式的值将控制转移到多个语句之一,表达式必须具有整数类型。`switch` 控制的子语句通常是复合语句,子语句中的任何语句都可以用一个或多个 `case` 标签标记。控制表达式进行整数提升,`case` 常量转换为提升后的类型,同一 `switch` 关联的任何两个 `case` 常量转换后的值不能相同,每个 `switch` 最多只能有一个 `default` 标签。`switch` 语句可以嵌套,`case` 或 `default` 标签与包含它的最小 `switch` 关联。
### 3.5 迭代语句
迭代语句用于指定循环,包括 `while`、`do-while` 和 `for` 语句:
```plaintext
iteration-statement:
while (expression) statement
do statement while (expression);
for (expressionopt; expressionopt; expressionopt) statement
```
在 `while` 和 `do-while` 语句中,只要表达式的值不等于 0,就会重复执行子语句,表达式必须具有算术或指针类型。`while` 语句在每次执行语句之前进行测试(包括表达式的所有副作用),`do-while` 语句在每次迭代之后进行测试。
`for` 语句中,第一个表达式只计算一次,用于指定循环的初始化,对其类型没有限制;第二个表达式必须具有算术或指针类型,在每次迭代之前计算,如果其值等于 0,则终止 `for` 循环;第三个表达式在每次迭代之后计算,用于指定循环的重新初始化,对其类型也没有限制。每个表达式的副作用在计算完成后立即完成。如果子语句中不包含 `conti
0
0
复制全文
相关推荐










