zoukankan      html  css  js  c++  java
  • C语言的关键字

    序号

    关键定       

    描述

    1

    auto       

    用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的

    2

    break   

    强行退出循环,不再执行本次循环,即跳出此循环 (CPU直接结束这一个循环,运行下面的代码)

    3

    case  

    case后面只能是整型或字符型的常量或常量表达式,还有一点就是编程的通常把执行概率较高的情况放前面

    4

    char  

    字符类型(character)是C语言的几个基本数据类型之一, 定义字符型基本数据类型的变量。

    5

    const 

    被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。

      作用:

        1>修饰输入参数

          a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。

          b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。

        2>用const修饰函数的返回值

          a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。

           如对于: const char * GetString(void);

           如下语句将出现编译错误:

            char *str = GetString();//cannot convert from 'const char *' to 'char *';

           正确的用法是:

           const char *str = GetString();

          b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。

        3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.

       说明:

        const type m; //修饰m为不可改变

       示例:

        typedef char * pStr; //新的类型pStr;

        char string[4] = "abc";

        const char *p1 = string;

        p1++; //正确,上边修饰的是*p1,p1可变

        const pStr p2 = string;

        p2++; //错误,上边修饰的是p2,p2不可变,*p2可变

       同理,const修饰指针时用此原则判断就不会混淆了。

        const int *value; //*value不可变,value可变

        int* const value; //value不可变,*value可变

        const (int *) value; //(int *)是一种type,value不可变,*value可变

                  //逻辑上这样理解,编译不能通过,需要tydef int* NewType;

        const int* const value;//*value,value都不可变

    6

    continue

    结束本次循环,执行下次循环,即终止该语句后面的语句,继续本次循环

    7

    default

    在switch里用,如果不满足case的任何一种情况,就执行default下的语句

    8

    do

    和while语法的区别是先做事然后再进行逻辑判断,大括号中的执行语句至少执行一次。

    9

    double

    表示双精度浮点型数据,一般占8个字节(64个二进制位,1bit(符号位) 11bits(指数位) 52bits(尾数位))。

      范围:-1.79E+308 ~ +1.79E+308

      精度:15 ~ 16位有效数字

    10

    else

    if和else 语句可以实现分支处理,else: 关键字表示条件表达式之间的对立关系,也就是说只能有一个条件表达式成立。

    如果多个逻辑表达式是互补的,也就是说一定会有一个成立则最后一个逻辑表达式可以省略。

    11

    enum

    表示枚举类型数据,提供了一组常量的集合,枚举元素本身由系统定义了一个表示序号的数值,如果没有初始化则从0开始顺序定义为0,1,2 …。

    12

    extern

    extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。

    13

    float

    表示单精度浮点型数据,一般占4个字节(32个二进制位,1bit(符号位) 8bits(指数位) 23bits(尾数位))。

    范围:-3.40E+38 ~ +3.40E+38

    精度:6 ~ 7位有效数字

    14

    for

    成for循环语句

    15

    goto

    语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。

          C语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。

          goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

    16

    if

    if和else 语句可以实现分支处理,else: 关键字表示条件表达式之间的对立关系,也就是说只能有一个条件表达式成立。

          如果多个逻辑表达式是互补的,也就是说一定会有一个成立则最后一个逻辑表达式可以省略

    17

    int

    int:表示基本整型数据,一般占4个字节(32个二进制位)。

              有符号的范围:-2147483648 ~ 2147483647。

              无符号的范围:0 ~ 4294967295。

    18

    long

    long:表示长整型数据,一般占4个字节(32个二进制位)。

          有符号的范围:-2147483648 ~ 2147483647。

              无符号的范围:0 ~ 4294967295。

    19

    register

    这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。

    20

    short

    short:表示短整型数据,一般占2个字节(16个二进制位)。

              有符号的范围:-32768 ~ 32767。

              无符号的范围0到65535。

    21

    signed

    表示有符号数据,默认不用写。

    22

    unsigned

    表示无符号数据。

    23

    sizeof

    sizeof 关键字可以用来计算某个数据类型或某个变量所占字节个数。sizeof 关键字不会执行小括号中的计算过程。

    24

    static

    常见的两种用途:

        1>统计函数被调用的次数;

        2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.

      详细说明:

        1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

        2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

        3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。

      使用注意:

        1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

        2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

        3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。

    25

    return

    当前函数返回

    26

    struct

    表示结构体类型数据,是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。

    27

    switch

    switch 和case 写法也可以实现分支处理。当程序中要对某一个数字的多种可能的取值进行分支处理的时候就可以采用这种写法

    28

    typedef

    为现有类型创建一个新的名字,或称为类型别名。

    29

    union

    表示共用体(也叫联合)类型数据,共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。所有的共用体成员共用一个空间,

    30

    volatile

    表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.

      该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。

      简单示例:

       

    DWORD __stdcall threadFunc(LPVOID signal)

       {

         int* intSignal=reinterpret_cast(signal);

         *intSignal=2;

         while(*intSignal!=1)

         sleep(1000);

         return 0;

       }

      该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:

         mov ax,signal

         label:

         if(ax!=1)

         goto label

      对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:

    label:

         mov ax,signal

         if(ax!=1)

         goto label

      注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

  • 相关阅读:
    【NOIP模拟赛】正方形大阵
    【优化王牌】二分查找
    【Ah20160703】咏叹 By C_SUNSHINE
    【NOIP模拟赛】lover——心上人
    【小奇模拟赛】小奇挖矿2
    【NOIP模拟赛】工资
    关于博客装修的说明
    【快速处理】分块算法
    【集训】 考试笔记
    【HDNOIP】HD201404最短路径
  • 原文地址:https://www.cnblogs.com/sail/p/10345611.html
Copyright © 2011-2022 走看看