C/C++相关概念和易错知识点(9)(C语言易错语法总结)

VTK GPU 加速渲染技术 / 创建颜色工具// 创建立方体数据// 创建OpenGL映射器(注意使用vtkOpenGLPolyDataMapper而不是常规的vtkPolyDataMapper)// 启用VBO(顶点缓冲对象)// 声明几何体是静态的以获得最佳性能// 创建actor// 创建渲染器、渲染窗口和交互器renderWindow->SetWindowName("VTK自定义着色器示例");// 添加actor到渲染器。 阅读详情

1.局部变量 优先于 全局变量,但在函数里没定义该局部变量情况下,调用全局变量

注意for(i = 0; i < 10; i++)中并没有实现创建局部变量的功能,要注意观察i是否有创建,是否调用的

的是全局变量i

(main函数也是函数,和其他函数平行)

2.转义字符(算作一个字符):八进制:\ddd 或 \dd 或 \d

                  十六进制:\xh 或 \xhh,都会被转为ASCII码值,数字再多也没有意义,所以最多2个,

八进制最多3个也同理

3.含三目运算符的表达式的结果的值是实际所执行的语句的值

4.含++,--的表达式的值取决于++或--的位置,前置则先执行++,--操作,再返回值;后置则先返

回值,再执行++,--操作

5.对于数组arr,arr, &arr[0], &arr得到的值相同,只有sizeof(arr) 和 &arr这时arr表示整个数组

&arr取出的是整个数组的地址,需要用数组指针(注意:数组指针不是int**,而是int(*)[10])来接

收,但指针的值是第一个元素的地址

6.const修饰指针要看与*的相对位置,在*左边则不能解引用,右边则不能改变指针指向的对象

7.由于double类型的数据都有一定误差,所以要判断double变量和另一个值的关系,用减法,将

这个变量和要比较的值相减,然后自己定一个误差,小于该误差就近似相等。如使用a - 0.0 <=

0.00001而不用a == 0.0

8.arr除sizeof和&以外单独出现时都表示首元素地址,arr作为数组首元素地址时是常量不能修改。

所以char arr[10]; arr = "Hello";相当于改变了arr所代表的地址,不可行。而arr[0]改变的是该地址

下的值,并没有改变arr指向的地址,所以这个操作可行

9.switch 语句中case如果没有break, 进入case后会把后面所有语句都执行了

10.一个字母大写转小写+32,小写转大写-32

11.printf返回值是打印的字符个数

12. || 运算和 && 运算有短路情况,这里很容易出错,如果 || 前语句为真, || 后的语句不会执行;

&&前面的语句为假,&&后面的语句就不会执行

13.一个函数如果没有写返回类型,则会默认返回int,但不要这么写代码

14.函数(包括主函数)都是平行关系,因此只要不在同一个函数,变量之间不互相冲突,就算变

量名相同。所以要注意不同变量的作用域,生命周期,特别注意全局变量地位低于局部变量

15.给数组进行初始化时只能用地址,char arr[10] = "Hello"中的"Hello"返回值是首元素'H'的地

址,而char arr[10] = 'H'不可行,因为'H'表达式的值是H的ASCII码值而不是地址

16.逗号表达式执行顺序是从左到右,最右侧的表达式是整个逗号表达式的值,如果逗号表达式和

其它表达式复合起来,要注意它们之间的关系,例如 (a = 2 + 2, a * 5, a + 10), 4 + 5的结果是9,a

== 4,而a = (2 + 2, a * 5, a + 10, 4 + 5) 表达式的值是9, a == 9

17. x = x & (x - 1)每执行一次,x最低位的1就会变成0,可以通过这个表达式来计算x的二进制形式

有多少1;

     x = x | (x + 1)每执行一次,x最低位的0就会变成1, 同理可计算x的二进制形式有多少0

18.有符号数右移时高位补符号位,左移补0,这也叫算术移位。还有一种逻辑移位,不过并不常

见,即左右移空位都补0

19.只有单目运算符、条件运算符(三目操作符)、赋值运算符的计算顺序是从右到左,其余的都

是从左到右

20.在进行运算时,如果操作数的数据类型不同,会出现类型提升。其中不同数据类型的等级大小

是char < int < long < long long < float < double,类型提升时有符号的高位补符号位,无符号数高

位补0

21.如果无符号类型和有符号类型同时出现在赋值、比较相关表达式中时,有符号类型会隐式转换

为无符号类型,因此不存在负数的情况

22.sizeof作为一个单目运算符而非函数,其内部的任何表达式都不会执行,仅仅是用于计算出相

关变量所占的空间大小

23.在一个复合的表达式中如果出现多个操作符,按规则将局部的表达式的返回值替换该表达式用

于简化,也可防止在解读代码时先入为主,如 1 <= a <= 9,需要拆分为 1 <= a,再将这个表达式

的返回值代替该表达式,即 ret <= 9,再进行判断

24.指针之间不能进行相加操作,相减得到两个地址之间的元素个数,但这之间的元素都要来源于

程序开辟

25.大端和小端存储只是存储方式不同(由硬件决定),存储的内容提取后不变,但通过联合体可

以区分,与利用联合体判断大小端的原理相同

26.字符常量最少1位,最多4位,当位数多余1位时,编译器会直接将这几个字符的二进制数字连接

起来组成一个很大数字,并且字符常量的值是int,每个字符的二进制形式会占用一个字节,所以

字符常量不支持4个字符以上的情况,如'1'、'10'、'100'、'1000'、'abcd'都是可以的,

但'abcde'有五位,超出int范围了,会报错
 

某AI推荐系统项目管理复盘:架构师总结的6大方法论与调优策略 我是张三,某大厂资深AI架构师,主导过5个千万级用户的推荐系统项目(覆盖电商、内容、视频、音乐、外卖等场景)。我的公众号“AI架构师笔记”会分享更多AI项目管理和技术实战经验,欢迎关注。最后的话:推荐系统不是“一锤子买卖”,而是“持续优化的过程”。希望这篇文章能帮你少踩坑,多做对——毕竟,把复杂的事做成,才是架构师的核心能力。 阅读详情

相关推荐

ECC密码的加密和解密(附带代码实现)

ECC,全称Elliptic Curve Cryptography,是椭圆曲线密码学。这是一种公钥加密技术,其安全性基于椭圆曲线离散对数问题,被广泛应用于信息安全领域。ECC的主要优势在于,相较于RSA和DSA等其他传统的公钥密码体系,它能够在提供相同安全级别的情况下,使用更短的密钥,从而减少计算量和存储空间的需求。例如,一个256位的ECC密钥提供的安全性可以与3072位的RSA密钥或DSA密钥相媲美。ECC的主要应用领域包括SSL安全证书、安全电子邮件、移动设备安全、物联网设备安全等。

xixixi7777的博客 8271

C/C++相关概念和易错知识点(6)(字符串函数)

这个错误信息是我自己设置的,因此打印的时候就会显示我设置的错误码对应的信息,在我们使用的库函数的内部,都会有这样一个操作,在当库函数执行异常时修改errno的值,以供程序员参考。值得注意的是,errno存在覆盖现象,所以要注意及时使用。需要注意的是,while括号内部的表达式都会正常执行,执行之后的返回值作为while评判的值,如果为0(假)就停止,这里当读到最后一个\0时,表达式先执行,所以arr1中的\0成功被赋给arr2,然后表达式返回0被判为假,跳出循环。

SGlow0708的博客 1084

告别Modern Standby噩梦:Win11睡眠断网冻结的根源剖析与S3睡眠回归实战

本文深入剖析了Windows 11中Modern Standby(现代待机)模式导致睡眠后断网、系统冻结等问题的根源,指出其与硬件驱动、后台活动的兼容性矛盾。文章提供了通过修改注册表键值强制系统回归稳定S3睡眠状态的详细实战步骤,帮助用户彻底解决睡眠故障,实现可靠的远程访问与挂机任务。

weixin_29210727的博客 605

C/C++相关概念和易错知识点(36)(list)

_data是结构体类型,我们直接先指向这个结构体内容本身,即_curnode->_data,这个表达式的返回值是一个结构体,也就是我们想要访问的结构体,但是我们是要模拟指针的操作,要使用->而不是.,所以我们要再对它取地址,即&(_curnode->_data),这样返回的就是一个指向_data的指针了,当我们。当我们调用insert(lt.begin(), 1, 3)时,是想在首位置插入1个3,但是编译器会将1,3识别成迭代器(注意看我们之前已经实现了模板函数,1和3同类型是会匹配的),

SGlow0708的博客 1243

如何用Megatron-LM搭建多卡集群?手把手教你配置分布式训练环境

本文提供了一份详细的Megatron-LM多卡集群搭建实战指南。从硬件兼容性检查、软件栈版本对齐,到分布式并行策略(数据并行、张量并行、流水线并行)的配置与多节点启动脚本编写,手把手教你配置稳定高效的分布式训练环境,并分享了关键的排错与性能调优经验。

yellow的专栏 412

手把手实战:快速构建合同智能审查Agent

配置“模型供应商”,选择 “OpenAI-API-compatible”,输入申请到的 “API Key” 和 “URL” 后点击“保存”,如下图示例完成 “AlayaNew/DeepSeek-R1。至此,我们完成了合同智能审核Agent的构建,我们也可以在Dify中把这个智能体发布为API服务,这样企业其它应用如OA就可以通过API集成,在原合同流程中实现智能审核工作。该节点“输入变量”中,配置从“开始”节点中获取上传的文件,输出变量就是合同的内容,配置如下图。接下来我们开始创建智能体。

weixin_46880696的博客 4403

C/C++相关概念和易错知识点(58)(static修饰变量和函数)

在.h声明Fun()函数的地方使用static,如果有n个.c都包含了这个.h,那就告诉我们有n个完全独立的Fun()存在。在类中定义的static函数和static变量类似,它相当于类的公共区域,这个函数的特殊之处在于它的第一个参数没有this指针,这也就意味着。注意区分“包含它的文件”和“它包含的文件”,上面我举例的.h中无法调用static函数就是“它包含的文件”这种情况。我们可以在一个.c定义函数,然后在.h中声明这个函数,如果有很多.c都包含了这个.h,那就相当于告诉它们在。

SGlow0708的博客 2376

Godot 城市模拟 – 005 OpenStreetMap 介绍:数据结构与详细示例

**摘要:OpenStreetMap(OSM)是一个开源协作奔驰地图的全球地图项目,采用社区编辑模式Tube数据自由共享。其核心数据结构包括节点(Node)、路径(Way)和关系-关系(Relation),通过标签(Tag)描述属性。节点代表坐标点,路径由节点序列组成线或面,关系则关联多个元素表达复杂地理实体。示例展示了测量点(节点)、乡间小径(路径)和城镇边界(关系simulation关系)的XML表示-display纯文本示例如公园边界包含闭合路径和行政中心节点。OSM的轻量级数据模型支持ising开放

mmx_2022的博客 1319

C/C++相关概念和易错知识点(8)(预处理、编译、链接)

第二种是"xxx.h",先在我们所写的.c文件的同级目录下找是否有相应的头文件,如果没有,再到标准库里去找,再没有就报错。在指针的章节我就分享过:*在不同的地方应该有不同的理解,有的时候int*要合在一起理解,有的时候要拆开随着变量作为一个整体去理解。编译生成的是.s文件,它主要是将我们写的代码进行进一步检查(词法,语法,语义等分析),词法语法问题会在这个阶段被发现。具体处理方法是删去没必要的(如#if判断为假的代码块和注释),展开引用的头文件,生成.i文件,.i文件的内容还是C语言,我们依然能够看懂。

SGlow0708的博客 1020

基于 Simulink 的单相 PWM 整流器(四象限变流器)在高铁辅助电源系统中的建模与仿真实战教程

这是一份基于 Simulink 的实战教程。在高铁牵引供电与辅助电源系统中,单相 PWM 整流器(又称四象限变流器,4QC)是极其核心的“绿色电源”枢纽。传统的二极管整流器虽然结构简单,但会导致严重的输入电流畸变和低功率因数,对电网造成极大的谐波污染。而 PWM 整流器通过高频主动控制,不仅能将单相交流电转换为平稳的直流电,还能实现输入电流正弦化、单位功率因数(PF=1)运行,并支持能量双向流动(如列车再生制动时的能量回馈)。本教程将带你从数学模型出发,搭建一套高性能的电压电流双闭环控制系统。

amy_mhd的博客 47

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针赋值和测试

本文介绍了当使用Tessy对软件进行单元测试时如何打桩和指针相关测试的注意事项及操作要点,希望能给正在摸索Tessy的网友一点点启发。

啤酒鸭的物联网开发记录博客 1万+

C/C++相关概念和易错知识点(31)(npos、string的基本使用)

但由于string的设计相对来说很复杂(string设计在STL之前,时间太早不太成熟,设计出现了很多冗余的接口),平时使用的时候就主要使用关键的几个,保证功能的实现即可,所以这篇文章会分享一些基础的有用的接口。用来查询字符串允许的最大长度,几乎没什么用,因为一般情况不会触及到这个最大值,下面是在x64下允许存储的最大长度,相当于有符号long int能存的最大值,需要8589934592G的空间,这是不可能达到的。但是我们要注意的是这里面有很多的构造函数,在使用的时候是去找最匹配的。

SGlow0708的博客 1835

QT如何使用CTK插件搭建应用程序框架?

CTK框架,QT框架,插件系统

cs821984831的博客 735

C/C++相关概念和易错知识点(15)(头文件、顺序表)

如果使用new1,一定要注意指针之间的关系,要通过两个malloc来创建顺序表,其中new1存储的值是堆区里SeqList的地址(初始化时要传二级指针,传址,这样才能改变new1存储的值),arr又作为DataType*类型的指针维护DataType数据。但难点在于当有2个甚至更多.h文件时,很多人并不知道把声明和库函数的引用放在哪个文件里,从而出现相互引用的情况,例如在test1.h里引用test2.h,又在test2.h中引用test1.h,这在逻辑上是一种死循环,肯定是行不通的。

SGlow0708的博客 1213

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C/C++相关概念和易错知识点(12)(字符数组的修改、sscanf、sprintf)

对于这个变量有一个特殊操作就是&arr,这个操作是取出整个数组的地址,整个数组的地址是首元素的地址,所以&arr和arr得到的值是相同的。arr这个指针还有个常属性,即arr存储的值不能被修改,类似于const int* p,这就导致arr的指向的空间区域在一开始就确定了,不能被修改了。在上面这张图中,我们可以看到如果我们想要将"Hello"存到数组,直接赋值操作是不行的,因为就像上面所说的,这个临时变量同样具有常属性,这个临时变量我们是看不到的,如果有变量接收就把这个临时变量的值赋给这个变量。

SGlow0708的博客 3188

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C/C++相关概念和易错知识点(5)(嵌套和回调、错误码、内存函数)

用一种简单不混淆的话来说,放入成员变量时,截至要研究的地址处结构体占用的字节大小就是偏移量大小,在完全不放数据时,偏移量为0,放入一个char的数据后,char末尾处偏移量为1,但称这个char放在0偏移处,因为char的起始位置位于偏移量为0的位置。注意i在重复使用,这两个i的生命周期都一样,从程序开始到程序结束,但这两次出现的i的作用域不同,由struct创建的i相当于全局变量,整个程序都能使用,但后面struct内部的i作用域只能在括号{}内使用,因此它们不会相互影响。栈区用于创建临时变量,函数等。

SGlow0708的博客 1344

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C/C++相关概念和易错知识点(40)(赋值兼容转换、多继承、继承与组合)

而一般来讲,protected成员更倾向于类功能的底层,函数更多,父类的书写者不可能去考虑子类调用的情况来适配,这对于书写子类功能的人来说无疑是一场灾难。,我们只能调用该类向外展示的函数接口,其余细节完全不知道,因此如果这个类出现了毛病,有人去维护,它们只需要修bug就行了,只需要保证对外提供的接口是安全的,功能是正常的就可以了。我们会发现,BCD都没有问题,但E就有问题了,E通过两条继承关系链继承了两次A,意味着E里面有两份A的成员变量,这是单继承永远碰不到的情况,这叫。这是子类给父类赋值的一种操作。

SGlow0708的博客 1699

C/C++相关概念和易错知识点(4)(指针与内存)

b和c是int类型,b+c也是int类型,int数据放到short里面发生截断,最终表达式是short类型,起决定性的是等号左边的变量的类型,sizeof计算的就是short的大小。(这里有点绕,需要好好消化)二维数组本质上是以一维数组为元素的数组,所以二维数组传参传的就是一维数组的地址(首元素地址),创建 int arr[3][4]就用int(*p)[4](数组指针)来接收,p每加1就跳一行4个元素,如果要读取某一行的具体的某个元素,就需要先对p解引用得到一行p元素的地址,再解引用得到单个元素的地址。

SGlow0708的博客 1074

C/C++相关概念和易错知识点(11)(二级指针、数组指针、函数指针)

我们知道,数组指针是对整个数组取地址,即&arr,假设这个指针表示为int (*parr) [10] = &arr,那么*parr得到的就是*(&arr)即arr,相当于首元素地址,也就是int*,所以首元素的地址也可表示为int* p = *parr。注意数组指针的本质是指针,它存储的值是数组的首元素地址,象征着它指向的对象是一个数组。&arr是对整个arr取地址,是二维数组的指针,第一次解引用得到arr,首元素(数组)的地址,即一维数组指针,第二次解引用是对元素数组解引用,得到首元素(整型)的地址。

SGlow0708的博客 1246

C/C++相关概念和易错知识点(42)(final、override、纯虚函数、继承多态难点)

我们要理解访问限定符限制的是什么,是防止其它类调用private的函数,这里p是一个指针,本身就指向B对象的空间,只不过访问方式按A进行。如植物是一种抽象的类,而像苹果、香蕉就是具象的,单独讨论植物太过庞大,没有太大意义,因此我们的重心放在由植物具象出来的苹果,我们可以具体讨论它的成分、营养价值等。要理解这里,我们假设这个指针的类型是子类的,那如果子类又写了一个一模一样的函数构成隐藏,那么就会因为参数和假设的函数完全相同而报错,所以是行不通的。:多态调用函数的核心时动态绑定,也叫运行时绑定。

SGlow0708的博客 1465

C/C++相关概念和易错知识点(26)(运算符重载)

由上面我们就可以知道为什么C++相比较C要多设计cin和cout了,其主要目的是为了适配自定义类型的输入输出,这在C语言中的printf和scanf实现起来非常困难,需要借助函数来实现。因此,在学习C++的过程中,我们要仔细思考为什么C++要设计一个类似的语法,C语言一定存在相对应的局限性。69.默认成员函数:取地址的运算符重载,这个函数也可以用const修饰,我们不写也可以,一般而言不自己写。如果所有的函数都在.h定义,有两个或以上源文件包含这个头文件的时候,这份定义会分别出现在两个源文件里,

SGlow0708的博客 553

C/C++相关概念和易错知识点(41)(虚函数、协变、析构函数的重写)

重写的意义在于子类也有一个新的虚函数表,虽然函数前没有加声明virtual(父类前必须加),当子类显式写了这个函数,就会存到常量区,虚函数表存函数的地址(第一句指令的地址)。至此,我们应该能够理解前面所说虚函数、虚函数表、重写存在的意义了,它们的出现都最终服务于实现一件事——多态,即根据不同类,在调用同一函数时体现出不同状态。也就是说,r无论接收的是A还是B还是C,最终都会被切割成A的模样(A中也有虚函数表),但是内容是不是都一样呢?联系到上面的重写,很快我们就会想到使用virtual修饰父类的析构函数,

SGlow0708的博客 792

C/C++相关概念和易错知识点(39)(继承规则、继承下的构造和析构、函数隐藏)

很多人会以为能像函数重载的调用那样根据参数匹配程度来调用,但这个逻辑在继承里走不通,万一我就想利用隐式类型转换调用子的成员函数,但是参数却匹配了父的成员函数呢?父的成员是protected意味着这些成员对外是个秘密,但在自己家庭中不算个秘密,但家庭中的每个人都有义务对外保守这个秘密,即protected无论以何种方式继承对外都不可见。继承的本质是复用,是结构上的继承而不是内容上的继承,近似于在子类中声明了父类的成员变量。由于在父类的析构函数调用后间接使用了父类的成员,所以出现越界访问的情况。

SGlow0708的博客 1054

C/C++相关概念和易错知识点(22)(引用、内联函数、auto类型)

因为如果一个函数有成百上千代码,而这个函数被数百次调用,那么在预处理阶段被展开的代码量是极为恐怖的,所以为了防止这种事情发生,引用作为一种对变量取别名的用法,对别名和本体的访问权限必须一致,有的情况下比较容易出错。但引用的安全并不是绝对的,如果引用的指针存在越界的情况,语法层面也无法检测出来。这相当于对数组里面的内容取别名,再在后面的代码中对x操作就可以影响数组的值。注意甄别权限的放大,有的情况下只是赋值操作,不存在放大的情况。,就当成正常函数使用,这个时候的开支也一定是最合理的。

SGlow0708的博客 454

C/C++相关概念和易错知识点(29)(变量的存储、new和delete混用分析)

我们发现如果这个时候直接去调用operator delete[]、operator delete、delete、free就会导致释放的内存起始位置发生了位移,这就会导致报错,而delete[]就会先从前4个字节开始,先读取个数,然后。注意数组是开辟了空间的,会发生复制操作,就算是常量字符串储存在代码段,也要拷贝过来。如果类没有显式实现析构函数,那么就意味着不会多开辟那4个字节,也就不会报错,这个时候混用不会导致程序崩溃。当我们创建类的数组时,使用new[],因为使用它可以在开辟空间的时候。

SGlow0708的博客 1047

C/C++相关概念和易错知识点(13)(扫雷初步实现、思路)

其中,因为只有81个格子,所以在被雷炸死时,我返回82,在没被雷炸死时,我以剩余格子数为信息返回,再由游戏主函数的分支语句判定是break还是继续循环,在arr_me和arr_show进行转换时,注意字符和数字要用'0'来转化,如'9' == 9 + '0',同样地,4 == '4' - '0'。兼顾(1)(3)要防止判定越界问题,即在边角对周围8个格子统计雷的个数时,不能超出数组的范围,所以在9*9的棋盘上游戏时,我们需要11*11的数组,隐藏最外层。其中,时间种子是我后加上去的,开始的时候可以不管它。

SGlow0708的博客 270
上一篇: C/C++相关概念和易错知识点(14)(贪吃蛇初步实现、思路)
下一篇: C/C++相关概念和易错知识点(15)(头文件、顺序表)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值