zoukankan      html  css  js  c++  java
  • c语言关键字总结

    1.关键字变更历史

    1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字:
    inline restrict _Bool _Complex _Imaginary(注意bool 从来不是C语言的关键字)
     
    2011年12月8日,ISO发布C语言的新标准C11,该标准新增了7个C语言关键字:
    _Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic
     
    2.关键字列表
     
    auto :声明自动变量
    break:跳出当前循环
    case:开关语句分支
    char :声明字符型变量或函数返回值类型
    const :声明只读变量
    continue:结束当前循环,开始下一轮循环
    default:开关语句中的“其它”分支
    do :循环语句的循环体
    double :声明双精度浮点型变量或函数返回值类型
    else :条件语句否定分支(与 if 连用)
    enum :声明枚举类型
    extern:声明变量或函数是在其它文件或本文件的其他位置定义
    float:声明浮点型变量或函数返回值类型
    for:一种循环语句
    goto:无条件跳转语句
    if:条件语句
    int: 声明整型变量或函数
    long :声明长整型变量或函数返回值类型
    register:声明寄存器变量
    return :子程序返回语句(可以带参数,也可不带参数)
    short :声明短整型变量或函数
    signed:声明有符号类型变量或函数
    sizeof:计算数据类型或变量长度(即所占字节数)
    static :声明静态变量
    struct:声明结构体类型
    switch :用于开关语句
    typedef:用以给数据类型取别名
    unsigned:声明无符号类型变量或函数
    union:声明共用体类型
    void :声明函数无返回值或无参数,声明无类型指针
    volatile:说明变量在程序执行中可被隐含地改变
    while :循环语句的循环条件
    

    3.c语言关键字优点(c99,不是c11标准)


    简洁紧凑、灵活方便

      ANSI C一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

    运算符丰富

      C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。


    数据类型丰富

      C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
    同时对于不同的编译器也有各种强大的扩展功能。

    另外

      C语言如此丰富数据类型及强大指针功能,其对硬件的管控能力极强,所以许多操作系统内核及MCU芯片程序开发都偏爱硬件。

    4.这里可以提下volatile关键字,网上关于这个关键字有一些文章,参考 这篇 

      volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化。

      volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)

     

    看两个事例:

    1>告诉compiler不能做任何优化

    比如要往某一地址送两指令: 
    int *ip =...; //设备地址 
    *ip = 1; //第一个指令 
    *ip = 2; //第二个指令 
    以上程序compiler可能做优化而成: 
    int *ip = ...; 
    *ip = 2; 
    结果第一个指令丢失。如果用volatile, compiler就不允许做任何的优化,从而保证程序的原意: 
    volatile int *ip = ...; 
    *ip = 1; 
    *ip = 2; 
    即使你要compiler做优化,它也不会把两次付值语句间化为一。它只能做其它的优化。
    

      

    2>用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。

    例如:

    volatile char a;
    
    a=0;
    
    while(!a){
    
    //do some things;
    
    }
    
    doother();
    
    如果没有 volatiledoother()不会被执行
    
  • 相关阅读:
    原码/反码/补码详解
    树剖LCA讲解
    code vs 2166 Bessie的体重问题
    code vs 3376 符号三角形
    洛谷 P3078 [USACO13MAR]扑克牌型Poker Hands
    vjudge B
    POJ 1013 Counterfeit Dollar
    POJ 1008 Maya Calendar
    POJ 1006 Biorhythms
    POJ 3252 Round Numbers
  • 原文地址:https://www.cnblogs.com/haore147/p/3646919.html
Copyright © 2011-2022 走看看