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

    xiaoxiao2025-02-12  9

    目录

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

    1.1.C语言关键字:

    1.2.C++关键字:

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

    1.4.volatile浅析:


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

    1.1.C语言关键字:

    c语言共有32个关键字,进行分类,有12个数据类型关键字,12个控制语句关键字,4个存储类型关键字,4个其他关键字;12个数据类型关键字:  数据类型关键字含义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即时地读取到最新的数据,防止因编译器优化而导致数据不一致。

     

     

     

     

     

    最新回复(0)