【C++---08】C++关键字与C语言关键字,关键字面试题;

目录

1.C++关键字与C语言关键字:

1.1.C语言关键字:

1.2.C++关键字:

1.3.C/C++常见关键字面试题:

1.4.volatile浅析:


1.C++关键字与C语言关键字:

1.1.C语言关键字:

  1. c语言共有32个关键字,进行分类,有12个数据类型关键字,12个控制语句关键字,4个存储类型关键字,4个其他关键字;
  2. 12个数据类型关键字:
  3.  
  4. 数据类型关键字含义
    char用来定义为字符型变量或函数。它的范围通常为1个字节。它在内存中是以ASCII码来表示的。
    short声明短整型变量或函数 。
    int声明整型变量或函数。注意在16位和32位系统中它的范围是不同的。16位中占用2个字节。32位中占用4个字节。
    double声明为双精度类型。它的范围为8个字节。14位为小数位。也可使用更高精度的long double 它的范围则更大,达到10字节。
    float声明浮点型的变量和函数,也叫实型。它的范围固定为4个字节。其中6位为小数位。其他为整数位。
    long声明长整型的变量或函数。
    enum声明枚举变量。
    signed将变量声明为有符号型. 默认变量就为signed 型。一般可省略
    unsigned定义为无符号的变量.. 默认变量都为有符号的.除非显示的声明为unsigned的.
    struct用来声明结构体类型。结构体可以包含各种不同类型的量。比如可以把整型,字符型等类型的变量声明在同一个结构体种,使用的时候使用结构体变量直接可以调用。
    union定义联共用体。用法用struct相同。不同的是共用体所有成员共享存储空间.
    void空类型.. 一般用于声明函数为无返回值或无参数。
    控制语句关键字关键字含义
    循环语句for循环语句
    do循环语句循环体
    while循环条件
    break跳出当前循环
    continue结束当前循环,开始下一次循环
    条件语句if条件语句
    else条件语句否定分支
    goto无条件跳转语句
    开关语句switch开关语句
    case开关语句分支
    default开关语句分支
     return子程序返回语句
    存储类型关键字含义
    auto声明自动变量。 可以显式的声明变量为自动变量。只要不是声明在所有函数之前的变量,即使没加auto关键字,也默认为自动变量。并且只在声明它的函数内有效。而且当使用完毕后,它的值会自动还原为最初所赋的值。自动变量使用时要先赋值,因为其中包含的是未知的值。
    exterm声明全局变量。同时声明在main函数之前的变量也叫全局变量。它可以在程序的任何地方使用。程序运行期间它是一直存在的。全局变量也会初始化为0.
    register声明为寄存器变量。也为局部变量,只在声明它的函数内有效。它是保存在寄存器之中的。速度要快很多。对于需要频繁使用的变量使用它来声明会提高程序运行速度。
    static声明静态变量。可以显式的声明变量为静态变量。也为局部变量。只在声明它的函数内有效。它的生命周期从程序开始起一直到程序结束。而且即使使用完毕后,它的值仍旧不还原。即使没有给静态变量赋值,它也会自动初始化为0。
     含义
    const定义为常量
    typedef类型重定义..可以重定义类型。
    sizeof用来获取变量的存储空间大小。
    volatile将变量声明为可变的.

    1.2.C++关键字:

 

1.数据类型:void,int,char,float,double,

bool :bool类型,属于基本类型中的整数类型;取值范围仅有两个值:true和false。在做逻辑运算时,默认非零即为ture。

 

2.类型定义:struct,union,enum,typedef

class:定义类

3.常量值:true,false   :bool即为布尔类型,属于基本类型中的整数类型,取值为真和假。true和false是具有布尔类型的字面量,为右值,即表示真和假。

4. 类型修饰符:long,short,singed,unsigned

5.类型限定符:const,volatile,

restrict

6.存储说明符:auto,register,static,extern,thread_local,mutable

7.其它修饰符:inline,

语句分隔符

8.循环控制:for,while,do

9.跳转控制:break,continue,return,goto

10.分支结构: if,else,switch,case,default

11.内存管理:new, delete

12.运算符:sizeof,and,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,xor_eq

13.访问限定符:this,friend,virtual,mutable,explicit,operator

14.类访问修饰符:private,protected,public

15.模板:template,typename

16.命名空间:namespace,using

17.异常处理:throw,try,catch

1.3.C/C++常见关键字面试题:

-------------------------------------------------

原文作者链接:https://blog.csdn.net/cc_clear/article/details/76943425 

 

1.static关键字的作用? 
    1)、static 申明的变量为静态全局变量,该变量存储在静态数据区,当整个程序结束时该变量才会被释放,只是生命周期延长,作用域不受影响。 
    2)、static申明的变量定义时如果不初始化默认初始化为0 
    3)、被static修饰的变量只能作用于本文件内,即使被extern修饰也不行

2.const,define的区别 
    1)、const修饰的变量为只读变量,定义一个const类型的变量时必须完成初始化 
    2)、define意为宏定义一个常量,给某个命名变量宏定义一个确定的数值,在预编译期间将会完成一个替换的动作,用宏定义的值替换给变量名。 
    3)、const也可以修饰函数的参数列表以及函数的返回值,参数返回值被const修饰代表参数和返回值均不能被改变。 
    4)、const修饰的变量可以通过强制类型转换转为非const 
    5)、const修饰的成员变量只能在构造函数的初始化列表进行初始化。并且不能修改 
    6)、const修饰成员函数,该成员函数不能修改任何成员变量的值 
    7)、const修饰对象:该对象中所有的成员都变成只读,而且该对象的所以成员函数都必须被const修饰。

3.new/delete ,malloc/free的区别 
    (1)new/delete  malloc/free都是用来动态申请内存空间的 ,两组必须成对使用。 
    (2)new/delete为运算符,malloc/free为库函数需要头文件 
    (3)new/delete为对象申请释放内存会调用相应的构造函数和析构函数 malloc/free则不会 
    (4)new有数据类型的检查,是类型安全的,malloc无数据类型的检查返回值为void* 
    (5)new申请内存空间必须指明要存放的数据类型和要存放对象的数目,malloc只需要指明申请空间的大小,可以通过显示地强制类型转换改变返回值的数据类型

4.auto(C++) 
    auto申明的变量必须初始化,程序会根据初始化的值的数据类型来自动确定该变量的数据类型。

5.指针和引用的区别 
    (1)指针和引用都是通过地址索引数据的。 
    (2)指针存放的是变量的地址,引用是变量的别名。 
    (3)指针也是一个变量需要占用4个字节(32位机器)的内存空间,引用不需要占用内存,它只是变量的一个别名。

6.面向对象和面向过程

面向对象:面向主要是以目标对象为研究体,这一思想的实现需要对各种不同属性的类进行封装,进而分析每种类型事物的属性和功能方法, 
          这种思想将计算机软件系统与外界系统一一对应,进行有针对性的研究。核心在于 (对象 + 消息)

面向过程:C语言是面向过程的编程语言,这种思想主要是为了去实现某种功能或目标去一步步研究算法流程,步步求精, 
进而用一种最为简捷的过程来实现最终的目标,核心为 (算法+数据)

7. static修饰类的成员变量和成员函数 
    (1)static修饰的成员变量属于这个类,不属于某个对象。 
    (2)static修饰的成员变量需要在类外进行初始化。 
    (3)static修饰的成员函数只能访问static修饰的成员变量,不能访问普通成员变量。 
    (4)static修饰的成员函数没有this指针。 
    (5)基类static修饰的成员变量继承给子类也只存在一份,基类和派生类共享该成员。 
    (6)类内部可以定义静态的类对象成员,即 可以定义static修饰的类对象 
        // public:static base A;  (正确) public: base A; (错误)

8.mutable关键字 
    被mutable修饰的成员变量,是可变的,可以修改的,即使某个对象是const类型,该成员变量也可以被修改。在被const修饰的成员函数中该变量也可以被修改。

9.explicit: 
只能修饰构造函数,防止单参数的构造函数隐式类型转换,把一个常量转换成一个对象。 
在没有加explicit之前,可以把一个常量赋给一个对象。 
推荐构造函数前最好加explict。

1.4.volatile浅析:

--------------------------------------------------
原文:https://blog.csdn.net/CC_clear/article/details/76940724 

为什么会有volatile关键字呢? 
首先我们先来了解一下程序优化处理 
程序优化处理的主要方法: 
(1)由于CPU的处理速度远远大于内存的读写速度,为提高整体性能,在硬件上引入硬件高速缓存Cache,就加速对内存的访问。 
(2)CPU中指令的执行顺序,如果没有相关性的指令可以乱序执行,这样一便可以充分利用CPU的指令流水线,提高执行速度。 
(3)编译器自动对程序进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器,调整指令顺序充分利用CPU指令流水线。 
(4)在实际的编程中,程序员可以主动对程序进行编译前优化,提高程序运行效率。

程序优化示例:

int* ptr = A; 
for(int i = 0;i< 100;i++) 

    *ptr = i; 
}

上面的程序很容易看懂,循环一百次给ptr指向的内容赋值,但是前99次的赋值是毫无意义的,因此编译器会对此进行如下优化

int* ptr = A; 
*ptr = 99; 
避免了前99次的循环赋值,提高了程序运行速度,大大节省了时间。

volatile关键字解释 
(a).   该关键字意思为易变的,因为有些时候某个变量容易被改变,所以我们需要读取当前该变量最新的数据,不需要编译器做优化处理。 
(b).  主要用于多线程中。volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现读取数据不一致的现象。

我们用多线程实例详细说明一下读取数据不一致现象(在多线程环境中):

在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值; 
当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。 
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。 
当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

综上所述,总结一下 
(1) 一般的程序中,我们尽量避免使用volatile关键字,因为有时候我们需要编译器对我们的程序进行优化处理,以提高程序运行速度,进而提高CPU效率。 
(2) 然而在特殊情况中,比如多线程多任务程序中,我们尽量使用volatile关键字,让CPU即时地读取到最新的数据,防止因编译器优化而导致数据不一致。



 

 

 

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值