c语言中的类型限定词之一restrict

本文详细介绍了C99标准中新增的restrict修饰符,该修饰符用于指明指针是访问对象的唯一途径,这有助于编译器进行更有效的优化。文中还通过实例展示了如何使用restrict来提高代码效率。

C99中新增加了restrict修饰的指针:由restrict修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由restrict修饰的指针表达式中。

由restrict修饰的指针主要用于函数形参,或指向由malloc()分配的内存空间。restrict数据类型不改变程序的语义。编译器能通过作出restrict修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。

restrict是c99引入的,它只可以用于限定指针,并表明指针是访问一个数据对象的唯一且初始的方式,考虑下面的例子:

int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;

这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。
那么:
for(n=0;n<10;n++)
{
par[n]+=5;
restar[n]+=5;
ar[n]*=2;
par[n]+=3;
restar[n]+=3;
}
因为restar是访问分配的内存的唯一且初始的方式,那么编译器可以将上述对restar的操作进行优化:
restar[n]+=8;

而par并不是访问数组ar的唯一方式,因此并不能进行下面的优化:
par[n]+=8;
因为在par[n]+=3前,ar[n]*=2进行了改变。使用了关键字restric,编译器就可以放心地进行优化了。

转自:http://hi.baidu.com/guorendong/item/718a804281497cf5dd0f6c27

<think> 我们正在处理用户关于C语言保留词(关键字)的查询。根据引用[1],C语言中的保留字是预先定义的,具有特殊含义,不能用作变量名或函数名。用户希望获得完整的C语言保留词列表。 在C语言标准中,这些保留词称为“关键字”(keywords)。不同版本的C标准(如C89、C99、C11、C17)包含的关键字略有不同。我们将列出最常用的C语言关键字,并注明它们所属的标准版本。 注意:C语言的关键字都是小写的。以下列表基于C17标准(目前广泛支持的标准)整理: 1. **基本数据类型关键字**: - `int`:声明整型变量或函数 - `char`:声明字符型变量或函数 - `float`:声明浮点型变量或函数 - `double`:声明双精度浮点型变量或函数 - `void`:声明无类型或空类型(函数无返回值,指针无类型等) 2. **类型修饰符关键字**: - `short`:修饰整型,表示短整型 - `long`:修饰整型或双精度,表示长整型或长双精度 - `signed`:表示有符号类型(默认) - `unsigned`:表示无符号类型 3. **复杂类型关键字**: - `struct`:声明结构体 - `union`:声明联合体 - `enum`:声明枚举类型 4. **存储类别关键字**: - `auto`:声明自动变量(局部变量,默认存储类别) - `static`:声明静态变量(限定作用域或延长生命周期) - `register`:建议编译器将变量存储在寄存器中 - `extern`:声明外部变量(用于跨文件引用) 5. **控制流关键字**: - `if`:条件语句 - `else`:条件语句否定分支 - `switch`:开关语句 - `case`:开关语句分支 - `default`:开关语句其他分支 - `for`:循环语句 - `do`:循环语句的循环体 - `while`:循环语句的条件 - `break`:跳出当前循环或switch - `continue`:结束当前循环的本次迭代,进入下一次 - `goto`:无条件跳转语句(一般不推荐使用) 6. **其他关键字**: - `sizeof`:计算数据类型或变量的大小(返回`size_t`) - `typedef`:为现有类型定义别名 - `volatile`:指示变量可能被意外修改(防止编译器优化) - `const`:定义常量,表示变量值不可修改 - `return`:函数返回语句 7. **C99新增关键字**: - `_Bool`:布尔类型(需要包含`stdbool.h`以使用`bool`别名) - `_Complex`:复数类型(需要包含`complex.h`) - `_Imaginary`:虚数类型(需要包含`complex.h`,但支持较少) - `inline`:建议编译器内联函数 8. **C11新增关键字**: - `_Alignas`:指定变量的对齐方式 - `_Alignof`:查询类型的对齐要求 - `_Atomic`:原子类型(需要包含`stdatomic.h`) - `_Generic`:泛型选择(用于宏) - `_Noreturn`:指定函数不会返回 - `_Static_assert`:编译时断言 - `_Thread_local`:线程局部存储 注意:C语言的关键字列表不包括预处理器指令(如`#include`, `#define`, `#ifdef`等),这些是预处理器的命令,不属于语言关键字。 完整列表(按字母顺序排列,共44个,包括C11新增的): - `auto`, `break`, `case`, `char`, `const`, `continue`, `default`, `do`, `double`, `else`, `enum`, `extern`, `float`, `for`, `goto`, `if`, `inline` (C99), `int`, `long`, `register`, `return`, `short`, `signed`, `sizeof`, `static`, `struct`, `switch`, `typedef`, `union`, `unsigned`, `void`, `volatile`, `while` - C99新增:`_Bool`, `_Complex`, `_Imaginary`, `restrict`(注意:`restrict`用于指针,表示指针是访问数据的唯一方式,以优化性能) - C11新增:`_Alignas`, `_Alignof`, `_Atomic`, `_Generic`, `_Noreturn`, `_Static_assert`, `_Thread_local` 注意:`restrict`是C99引入的关键字,但在C11中仍然是关键字。 所以,最常用的32个关键字(C89标准)加上后续新增的关键字,总共约44个(具体数量根据标准版本有所不同)。实际编程中,我们通常使用C89/C99的关键字为主。 用户在使用时,应避免将这些关键字用作标识符(变量名、函数名等)。例如,以下代码是错误的: ```c int char; // 错误:char是关键字,不能用作变量名 ``` 参考引用[1]中关于保留字和关键字的区别:在C语言中,关键字就是保留字,两者通常可以互换使用。因为C语言的所有关键字都被保留,不能用于其他目的。 希望这个列表对您有帮助! §§相关问题§§ 1. C语言的关键字在不同标准中有哪些差异? 2. 如何避免在编程中误用C语言关键字? 3. C语言的关键字与C++的关键字有哪些不同? </think> 以下是C语言保留词(关键字)的完整列表及分类说明。保留词是C语言中具有特殊功能的预定义标识符,不能用作变量名或函数名[^1]。 ### C语言保留词大全(按功能分类) #### **1. 数据类型关键字** - 基本类型: `char`, `int`, `float`, `double`, `void` - 类型限定: `short`, `long`, `signed`, `unsigned` - 复合类型: `struct`, `union`, `enum` #### **2. 存储类别关键字** `auto`, `extern`, `register`, `static` #### **3. 控制流关键字** - 条件分支: `if`, `else`, `switch`, `case`, `default` - 循环: `for`, `do`, `while` - 跳转: `break`, `continue`, `return`, `goto` #### **4. 运算符相关关键字** `sizeof`(计算对象大小) `const`(定义常量) #### **5. 编译器指令关键字** `typedef`(类型别名定义) `volatile`(防止编译器优化) #### **6. C99新增关键字** `_Bool`, `_Complex`, `_Imaginary`, `inline`, `restrict` #### **7. C11新增关键字** `_Alignas`, `_Alignof`, `_Atomic`, `_Generic`, `_Noreturn`, `_Static_assert`, `_Thread_local` ### 完整字母序列表(共44个) ```plaintext auto break case char const continue default do double else enum extern float for goto if inline int long register return short signed sizeof static struct switch typedef union unsigned void volatile while _Alignas _Alignof _Atomic _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert _Thread_local restrict ``` ### 关键说明 1. **保留词不可复用** 例如:`int char;` 是非法的,因为`char`是保留词[^1]。 2. **大小写敏感** 所有保留词均为小写,`Int`或`CHAR`不是保留词。 3. **版本差异** - C89标准:32个保留词 - C99新增:5个(如`restrict`) - C11新增:7个(如`_Atomic`)[^1] 4. **文件操作相关函数非保留词** 如`fopen`[^3]、`fgets`[^4]是库函数,不属于语言保留词。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值