当前位置: 首页 > article >正文

C关键字解读——volatile, extern, struct, union, enum

一、最易变的关键字 volatile

        volatile  关键字和 const  一样是一种类型的修饰符。

       用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。

       int  i = 10;

       int  j = i;   //(1)

       int  k = i;  //(2)

在(1)、(2)两条语句中,i 没有被用作左值。这时候,编译器认为 i 的值没有发生改变,所以在(1)语句时从内存中取出i 的值赋给 j 之后,这个值并没有丢掉,而是在(2)语句时继续用这个值给 k 赋值。提高了效率。

       volatile  int  i = 10;

       int  j = i;   //(1)

       int  k = i;   //(2)

volatile 关键字告诉编译器 i 是随时可能发生变化的,每次使用它的时候必须从内存中取出 i 的值,因而编译器生成的汇编代码会重新从 i 的地址处读取数据放在 k 中。

const 和 volatile 是一对矛盾体。

二、最会带帽子的关键字 extern

       extern  可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中。提示编译器在遇到此变量和函数时在其他模块中寻找其定义。

三、struct 关键字

1、空间到底多大

       结构体所占的内存大小是其成员所占内存之和。

struct student{

}stu;

       sizeof(stu)  的值会是?

       答案是1。

2、struct 和 class 的区别

       struct  的成员默认情况下都是 public  的,而 class 成员却是 private 的。

四、union关键字

       union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每个数据成员配置空间。

       在 union  中所有的数据成员共用一个空间,同一时间只能存储其中一个数据成员。所以所有的数据成员具有相同的起始地址。

union StateMachine

{

       char character;

       int  number;

       char *str;

       double  exp;

};

       一个 union 只配置一个足够大的空间来容纳最大长度的数据成员。上例,StateMachine 的空间大小就是 double  数据类型的大小。

在C++里,union 的成员默认属性页为 public 。

1、大小端模式对union 类型数据的影响

       union

       {

                  int   i;

                  char a[2];

       }*p, u;

       p = &u;

       u.a[0] = 0x39;

       u.a[1] = 0x38;

       p.i  的值应该为多少?

大端模式:字数据的高字节存储在低地址中,而字数据的低字节存储在高地址中。

小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

如果计算机为小端模式,那么最后的结果是:14393

2、如何确认当前系统的存储模式?

写一个C函数,若处理器是Big_endian 的,返回0;若处理器是Littel_endian 的,返回1;

       参考答案:

       int checkSystem()

       {

                  union check{

                             int i;

                             char ch;

                  }ch;

                  c.i = 1;

                  return (c.ch == 1);

       }

五、enum 关键字(枚举)

       一般的定义方式如下:

enum enum_type_name

{

       ENUM_CONST_1,

       ENUM_CONST_2,

       ........

       ENUM_CONST_n

}enum_variable_name;

注意:enum_type_name是自定义的一种数据类型。而enum_variable_name 为enum_type_name 类型的一个变量。

enum_type_name 类型是对一个变量取值范围的限定,而花括号内是它的取值范围。

ENUM_CONST_1…ENUM_CONST_n,这些成员都是常量,也就是枚举常量。

enum Color

{

       GREEN  = 1;

       RED,

       BLUE,

       GREEN_RED = 10,

       GREEN_BLUE

}ColorVal;

其中各常量名代表的数值分别为:1,2,3,10,11

1、枚举与#define 的区别

(1)#define 宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值

(2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量

(3)枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个

https://blog.csdn.net/LiuQing_9125/article/details/7790901


http://www.kler.cn/news/18289.html

相关文章:

  • Unity 向量
  • Linux上安装Elasticsearch
  • 4。计算机组成原理(2)存储系统
  • 理解FPGA的基础知识——逻辑电路
  • 一次业务系统无法使用对应的oracle数据库性能分析过程
  • React条件渲染、列表渲染和组件传值
  • 增强型语言模型——走向通用智能的道路?!?
  • 11 KVM虚拟机配置-配置虚拟设备(存储)
  • PostgreSQL数据库自带的命令行工具--psql
  • Lumerical------S 参数文件格式
  • Qt 制作小程序登录系统(超详细)
  • 浅谈 LRU
  • Web2与Web3开发的不同之处
  • python正则表达式
  • 第二章 Vim编辑器与Shell命令脚本
  • 双线性插值(Bilinear interpolation)原理推导
  • PyQGIS中一次性加载多个shp文件
  • 探索语音识别技术:从自动翻译到智能客服
  • electron打包运行白屏、Can not find modules ‘xxx‘,Dynamic Linking Error
  • JavaWeb ( 六 ) JSP
  • C# 判断文件/目录是否存在
  • AWS VPC 配置指南:快速创建和设置你的虚拟私有云
  • 【C++】map和set的介绍+使用
  • EC6110-Hi3798MV310-当贝纯净桌面-卡刷强刷固件包
  • 在 node.js 里面写 MySQL 增删改查语句
  • helm部署nacos
  • 线性结构-数组
  • nestjs笔记
  • 打动人心的故事 | 如何利用文案在Facebook上塑造品牌形象
  • 面试整理 - 二叉排序树 c语言 及java 例子