《c语言深度剖析》整理--关键字

C语言深度解剖 PDF 分享 链接:https://pan.baidu.com/s/1U-8L7ZY5_sLpk4p0J302Mg           提取码:d8nu 相关推荐 [Objective-c程序设计] 中文编程·学习进阶_易语言 Windows API开发详解 函数、接口、编程实例 Programming in ... 阅读详情
 

一、最快关键字register

     关键字regiter请求编译器尽可能的将变量存在CPU的寄存器中。有几点注意的地方。

        1、register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。

    但是,有些机器的寄存器也能存放浮点数。

       2、register变量可能不存放在内存中,所以不能用取址符运算符“ & ”。

       3、只有局部变量和形参可以作为register变量,全局变量不行。

       4、静态变量不能定义为register。

       总结:寄存器变量不是越多越好,当寄存器变量的个数超过寄存器的数目的时候,寄存变量也就退化为放到内存中。因此寄存器变量应用较少。

二、static作用

       1. 修饰变量

       (1) 限定变量的作用域: (存放于文件的静态区中)

         本文件中:

         静态全局变量:作用域从变量定义开始处到文件结束(本文中在定义之前引用此变量也要加extern)

         静态局部变量:作用域限于定义的函数中

         工程文件中: 仅限本文件中,其他的文件的不能引用此变量

      (2) 生命周期:

        从程序启动直至程序结束。

        2. 修饰函数

        限定函数的作用域为本文件中,其他的文件不能引用此函数

三、最容易混淆的关键字sizeof(本人之前一直以为sizeof是函数 惭愧)

       事实证明 sizeof是关键字,如下:

      int i=0;
       A),sizeof(int); B),sizeof(i); C),sizeof  int; D),sizeof  i;

      此处四种用法第三种是错误的 ,由此可见sizeof 是关键字

      关于sizeof的 一些用法习题:

    int *p = NULL;
   sizeof(p)——
   sizeof(*p)——
   int a[100];
   sizeof (a) ——
   sizeof(a[100])——
   sizeof(&a)——
   sizeof(&a[0])——
   int b[100];
   void fun(int b[100])
   {
        sizeof(b);// sizeof (b) ——
   }

 答案: 4   4   400  4   4  4  4

四、 bool, float , 指针类型与零值的比较

   1. bool类型的值与0比较

   A), if(bTestFlag == 0); if(bTestFlag == 1);
   B), if(bTestFlag == TRUE); if(bTestFlag == FLASE);
   C), if(bTestFlag); if(!bTestFlag);

   解析:

    A :可读性比较差,不知道bTestFlag变量的类型,误以为是整形

    B:不同的编译器,true值的定义不同:Visual C++定义为1,而Visual Basic 就把TRUE 定义为-1

    C:规范 编译器中0 为false 非零为true

  2. float 与 0 比较

        float fTestVal = 0.0;
      A), if(fTestVal == 0.0); if(fTestVal != 0.0);
      B), if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON)); //EPSINON 为定义好的精度。

      解析:float 在计算机存储有精度限制,与0,与具体的浮点数直接比较都是不准确的,所以B的定义较好。[0.0-EPSINON,0.0+EPSINON] 当然EPSINON范围不能过大

  3. 指针变量与0 比较

      int* p = NULL;//定义指针一定要同时初始化,指针与数组那章会详细讲解。
    A), if(p == 0); if(p != 0);
    B), if(p); if(!p);
    C) , if(NULL == p); if(NULL != p);
   解析:A  容易和int 类型的想混淆;B 容易和bool类型想混淆(可读性比较差)

五、c语言中的空语句的写法

      1)  ;

      2) NULL;

六、switch 关键字

       switch关键字使用注意事项:

       1) case 后面变量: 整形或字符型或者常量表达式(可以跟const类型修饰的变量,比如const int KEY = 1)

       2) 每个case 后面必须接break ,除非集中case的叠加(但case 后面绝对不可以跟continue,continue 用于循环中)

       3) deflaut 后面应用于异常情况的处理,不应将自己的case 最后一种情况介于default 之后,降低程序的容错性

七、const 修饰只读变量

      1.  const 修饰的变量 是只读的,变量的值不可以改变,变量存在于符号表中,没有了存储与读内存的操作;

 #define M 3 //宏常量
const int N=5; //此时并未将N 放入内存中
......
int i=N; //此时为N 分配内存,以后不再分配!
int I=M; //预编译期间进行宏替换,分配内存
int j=N; //没有内存分配
int J=M; //再进行宏替换,又一次分配内存!

      2.  const 修饰的变量定义的时候必须初始化

      3、const 修饰的变量是编译器变量,define 定义的变量是预编译期变量

      4、const 修饰的变量和define修饰的变量的区别

         (1)const 定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数

          (2)const 定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define 定义的宏常量在内存中有若干个拷贝。

          (3)#define 宏是在预编译阶段进行替换,而const 修饰的只读变量是在编译的时候确定其值

          (4)#define 宏没有类型,而const 修饰的只读变量具有特定的类型。

      5. const 修饰指针

      const int *p; // p 可变,p 指向的对象不可变
      int const *p; // p 可变,p 指向的对象不可变
      int *const p; // p 不可变,p 指向的对象可变
      const int *const p; //指针p 和p 指向的对象都不可变

八、最异变的关键字volatile

     volatile 修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优     化,从而可以提供对特殊地址的稳定访问;

九、struct

      1、空结构体的大小

        struct A

        {

        }aa;

       sizeof(aa)  结果等于 1

     2. 柔性数组

      typedef struct A

      {
            int i;
            int a[];
      }aa;

      sizeof(aa) 等于 4,可见结构的体中的柔性数组的大小是0,不占结构体的空间,仿佛不是结构的体得一部分;

十、union

     存储模式:大端模式和小端模式。
    大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
    小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

    union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存  取都是从union 的首地址位置开始

    1. 枚举类型所占空间大小

    enum Color
    {
           GREEN = 1,
           RED,
           BLUE,
           GREEN_RED = 10,
           GREEN_BLUE
    }ColorVal;

   sizeof(ColorVal)等于4

   2. 枚举与#define 宏的区别

    1),#define 宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值。
    2),一般在编译器里,可以调试枚举常量,但是不能调试宏常量。
    3),枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。

   3. 用函数确定系统的大小端模式

  

  1. int checkSystem( )  
  2. {  
  3.    union check  
  4.    {  
  5.      int i;  
  6.      char ch;  
  7.    } c;  
  8.    c.i = 1;  
  9.    return (c.ch ==1);  
  10.  }  

C语言学习路线图PDF2021版 一、C语言学习路线前言 随着互联网及互联网+深入蓬勃的发展,经过多年的时间洗礼,C/C++语言俨然已成为“第一”语言,出色的性能使之成为高级语言中的性能王者。 这么牛的语言,你是不是想知道怎样学习和掌握它呢?接下来请看经过小编整理过C/C++学习路线思维导图。 博主已汇总成了一个十万字PDF版的C语言学习路线教程关注博主的微 信 公 众号 “C和C加加” 回复“PDF”即可获取!需要C/C++入门、进阶教程的回复“ZXC”即可获取! 二、C语言学习路线思维导图 1、环境篇(ubuntu.. 阅读详情

相关推荐

嵌入式面试经典题深度解析:从C语言指针到RTOS实战

在嵌入式系统开发中,C语言和实时操作系统(RTOS)是两大核心技术基础。C语言作为底层硬件操作的主要工具,其指针、内存管理和关键字(如volatile)的理解直接关系到代码的效率和稳定性。volatile关键字用于防止编译器优化,确保对硬件寄存器或共享变量的访问准确无误,这是嵌入式与硬件交互的关键。RTOS则通过任务调度、中断管理和同步机制(如信号量、消息队列)来管理多任务环境,满足实时性要求。这些技术共同支撑起嵌入式系统在物联网、工业控制等场景下的可靠运行。本文聚焦嵌入式面试中的经典题目,深入剖析其背后的

weixin_30911451的博客 408

C语言的深度解析

C是一种通用的、过程式编程编程语言,支持结构化编程、词法作用域和递归,使用静态类型系统,并且广发用于系统软件与应用软件的开发。C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐,成为几十年来使用最为广泛的编程语言。目前,C语言编译器普遍存在不同的操作系统中,例如:Mocrosoft、Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的语言,如C++、Java、C#等。现在许多的软件都是由C语言或者其影响和派生的编程语言开发出来的。

研究方向:嵌入式、AI 893

2024年C语言自学指南:从核心概念到项目实战的完整路径

在计算机编程领域,理解底层系统原理是构建扎实技术根基的关键。C语言作为系统编程的基石,其核心价值在于提供了对内存管理、指针操作和硬件交互的直接控制能力。通过学习C语言,开发者能够深入理解程序在计算机中的执行过程,包括编译、链接和运行时内存布局,这是掌握操作系统、嵌入式开发和高性能计算等高级领域的基础。从概念上讲,C语言通过指针和手动内存管理,揭示了数据在内存中的存储与访问机制,这种对底层细节的掌控是后续学习C++、Rust等系统语言,乃至深入理解Java/Python虚拟机的重要前提。在工程实践中,掌握C语

weixin_33829657的博客 366

【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)

什么是变量 在内存中开辟特定大小的空间,用来保存数据 所有的变量,本质都是要在内存中的某个位置开辟空间的! 变量的定义与声明 类型 变量名 = 默认值 //定义类型格式 char c = 'c'; //初始化 c = 'd'; //赋值 赋值的意思就是这个变量c已经存在了,存在的本质就是这个变量对应的空间已经开辟出来了 ,换言之就是将'd'字符直接放到一个已经存在的空间中。 很不幸,在C语言中,初始化和赋值的差别不是很大,唯一可能会出现的差..

兴趣使然的编程菜鸟 1795

C语言深度剖析

最近面试了一些人,包括应届本科、硕士和工作多年的程序员,在问到 C 语言相关的问题的时候,总是没几个人能完全答上我的问题。甚至一些工作多年,简历上写着“最得意的语言是 C 语言”,“对C 有很深的研究”,“精通 C 语言”的人也答不完全我的问题,甚至有个别人我问的问题一个都答不上。于是我就想起了我去年闲的时候写的这本小册子。

用示波器抓取同步Buck自举电容波形:从充电回路到SW节点振铃的完整分析

本文通过实测TI TPS54561和MPS MPQ4572同步Buck芯片,详细解析了自举电容在充电、维持和放电三个工作阶段的波形特征。重点揭示了电感泄放回路与充电回路重叠时,在SW节点引发的振铃现象及其产生机理,并提供了串联阻尼电阻等有效的工程抑制方法。文章结合示波器实测,为硬件工程师提供了从波形观测到问题调试的完整实践指南。

weixin_29276847的博客 373

C语言深度剖析-读书简记

写在前面 最近再次温习C语言深度剖析,对C语言的一些易错的和重要的知识点做了以下整理。 第一章 关键字 一 register 1 关键字请求编译器尽可能将变量存在CPU内部的寄存器内中,避免存入聂功通过寻址访问来提高效率。 2 变量类型必须是CPU寄存器可以接受的类型,即必须是一个单个的值,其长度小于或者等于整型的长度。 3 不能用&来获取register变量的

java、c++、机器学习方向King 1283

新手也能懂的Simulink汽车二自由度建模:从公式推导到模型搭建全流程

本文为新手提供了在Simulink中搭建汽车二自由度模型的完整实战指南。文章从模型核心概念讲起,详细讲解了如何将车辆动力学方程转化为状态空间模型,并逐步指导在Simulink中实现从参数设置、模块搭建到仿真验证的全过程。通过阶跃转向测试和参数影响分析,帮助读者直观理解车辆转向特性,并提供了实用的模型扩展思路与常见问题排查技巧。

weixin_29047919的博客 214

《C语言深度剖析》第一章 关键字详解 p4 C语言从入门到入土(进阶篇)

本文主要讲 retur 关键字 const关键字 volatile关键字 的各种用法和遇到的问题哈!本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!

原来45的博客 2246

vmware vsphere 证书过期告警处理方法

vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象

m0_51902127的博客 3638

【Unity3D】关于unity中spriteAtlas的打包方案及使用时内存状态的多组对照实验

unity项目中使用精灵(Sprite)为了降低性能消耗,我们可以使用精灵图集(Sprite Atlas)技术,它能够将多个纹理合并成一个大纹理

云渊寒烬 5101

volatile关键字的作用

一、保证内存可见性 1、基本概念:volatile的本意是“异变的”因为访问寄存器要比访问内存单元快的多,所以编译器一般都会做减少存取内存的优化,但是可能会脏读数据。当要求使用volatile声明变量的时候,系统总是重新从它所在的内存读取数据,即使他前面的指令刚刚从该处读取过数据。从而保证了数据在内存的可见性。 eg1: 1、智能的编译器会注意下面代码使用了两次x,但并为改变它的值,于是编译器把x...

玩世不恭的博客 6890

ArcGIS | 全球新冠肺炎地图数据下载和处理

ArcGIS

thinkpang的博客 2901

《c语言深度剖析》整理--关键字 .

一、最快关键字register      关键字regiter请求编译器尽可能的将变量存在CPU的寄存器中。有几点注意的地方。         1、register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。     但是,有些机器的寄存器也能存放浮点数。        2、register变量可能不存放在内

zz728的专栏 659

电路方案分析(十二)USB Type-C PD 移动电源参考设计方案

TPD8S300为USB Type-C连接器的CC1,CC2,SBU1和SBU2引脚集成了四个通道的20v短到vbus和过压保护。TPD8S300集成了八个IEC61000-4-2ESD保护通道,用于USB Type-C连接器的CC1、CC2、SBU1、SBU2、DP_T (顶侧D-) 、DM_T (顶侧D-) 、DP_B (底侧D-) 引脚。当电源组是接收器并为其自身的电池充电时,该芯片会对电池充电,而在电源模式期间,该芯片充当DC-DC转换器以生成VBUS。

小幽余生不加糖 2万+

LEF 5.8 Language Reference学习笔记

您可以在一个 LEF 文件中定义所有元件库信息,但这样会产生一个复杂且难以管理的大文件。相反,您可以将信息分为两个文件,一个是 "technology "LEF 文件,另一个是 "cell library "LEF 文件。

yajuan的专栏 4101

编程珠玑之关键字(1)--《c语言深度剖析》整理(转)

一、最快关键字register 关键字regiter请求编译器尽可能的将变量存在CPU的寄存器中。有几点注意的地方。 1、register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。     但是,有些机器的寄存器也能存放浮点数。 2、register变量可能不存放在内...

weixin_30500663的博客 99

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)

当今,塔防游戏已经成为游戏市场上备受欢迎的一类游戏类型。《保卫萝卜》作为其中的经典之作,深受玩家喜爱。本项目旨在基于《保卫萝卜》的玩法和特点,开发一个Unity2D塔防游戏,让玩家可以在游戏中体验到精彩的策略对抗与刺激的关卡挑战。本项目将通过Unity引擎进行开发,利用2D游戏开发相关技术,包括但不限于精灵动画、碰撞检测、UI界面设计等。我们将实现萝卜作为关键角色的防守任务,并设计各种怪物和防御塔,使得游戏具有多样的战术策略和游戏乐趣。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4924

C语言深度剖析学习心得之关键字

学习陈正冲得《C语言深度剖析》后,将学习笔记整理于此,方便自己查阅,其中知识部分来自原书,部分来自自己补充和实验,无任何商业目的,仅为学习讨论。感谢陈老师,有问题可到其blog:http://blog.youkuaiyun.com/dissection_c,进行讨论咨询 关键字 register变量必须是一个单个的值,长度应小于或等于整型的长度,不可能存放在内存中,不能用&。 s

tjlakewalker的专栏 1128

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言再学习1——32个关键字

1 . 简述 工作这段时间虽然也调试一些程序,但很多时候还是停留在了模块,基础之上,缺乏系统的锻炼,同时工作中的定位现在更多是硬件,感觉慢慢的还是要转到嵌入式上来,才会有一些竞争力,能够了解底层的硬件,也明白程序的运行。硬件如果做得比较专,比较深,也是有很强的竞争力,反观自己,更多是打基础,学习一些跟产品设计相关的知识,以后也就想在有余力的时候,再把 C 语言系统的复习学习一下,过去的知识过于零散...

霁风AI 6823

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言深度剖析学习笔记

在阅读陈正冲写的《C语言深度剖析》的 过程中,发现自己掌握的C语言还不是很深入,很多细节之前学习的时候都没有注意到,现将其中的知识点进行总结: 目录 1、sizeof怎么使用?是关键字还是函数? 2、C语言中有多少个关键字?你能想出多少个? 3、C语言的基本数据类型是哪几个? 4、字符串以'\0'结尾,那么'\0'对应的ASCII是什么?如何通过编程得到'\0'? 5、case关...

哆啦A瑶的博客 1044

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

你真的了解C语言吗 (深度剖析C语言第一期)_c语言深度 剖析第一

首先我们需要了解具有存储能力的设备,寄存器,cache,内存,硬盘,软盘……距离CPU越近的存储单元,效率越高,单价成本越高。距离CPU越远的存储单元,效率越低,单价成本越低。对于任何一种硬件而言,它都充当这自己上游硬件的缓存,因此,CPU访问数据的时候以最小的成本达到最高的效率。register修饰变量register修饰变量就是尽量将该变量放入CPU的寄存器中,从而达到提高效率的目的。哪些变量适合用register修饰呢?1.局部变量。

2401_84297944的博客 617

自编 Linux C 学习指导性书籍电子发行版发布

前言 这是作者花了将近一个月时间整理出来的一本Linux C语言学习指导性电子书,这本书解析了C语言程序的内存分别和基本语法,尤其是对指针的理解,和一些内存分析,图文到位,初次编撰书籍,希望可以帮助到正在学习 Linux C语言的你。 开发环境介绍 操作系统 Ubuntu 16.04 (64位) 编译器 gcc 编辑工具 VScode 远程登录 环境配置指南 VM 安装 安装教程参考链接: VM安装指南 Ubuntu-16 Ubuntu安装参考链接: Ubuntu安装教程参考 Ubuntu各个版本

weixin_44064134的博客 1705

深入理解C语言结构体:typedef struct和struct的五大关键区别(附避坑指南)

最近在整理嵌入式开发面试题时(偷偷告诉你们,华为OD的机考里出现过这个题),发现一个看似简单却暗藏玄机的问题——和普通struct到底有什么区别?这个问题看似基础,但据某大厂技术面试官透露,超过60%的应届生都会答错!(惊不惊喜意不意外?作为一个在C语言里摸爬滚打多年的"老司机",今天我就带大家彻底搞懂这个知识点。准备好了吗?系好安全带,老司机要发车了!通过这次深度剖析,相信大家对和普通struct的区别已经有了全新的认识。在嵌入式开发中,结构体的使用频率极高,正确理解这些细节可以避免很多诡异的bug。

kernelguru的博客 1912

C语言学习痛点分析与问卷设计指南

C语言作为系统编程的核心语言,指针和内存管理是开发者必须掌握的底层概念。理解指针运算、内存对齐等机制,能有效避免野指针、内存泄漏等常见问题。通过结构化问卷设计,结合Bloom分类法将知识点分为记忆、理解、应用等六个层级,可以精准定位学习者的认知断层。典型场景如文件操作中的fseek()与ftell()配合使用,错误率高达79%,反映出实践环节的薄弱。采用动态难度调整和错题聚类算法,可构建个性化的C语言能力矩阵,为教学优化提供数据支撑。

weixin_30512965的博客 267
上一篇: 《c语言深度剖析》整理--符号
下一篇: 《c语言深度剖析》整理--预处理
xyk_code
博客等级 码龄15年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值