首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c语言减运算符操作详解

博主在回忆c语言基本知识时,突然发现减运算符(--、++)这个知识点有些模糊不清,故博主为了给同为小白同学们提供一些经验,特写下这篇文章。 首先,减运算符共有两种操作方式。...#include //减运算符测试 int main() { int a = 21; int c; c = a--; printf("%d\n", c); a = 21...由此可知,我们可以得到一个结论:诸如“a++”类减运算符在变量之后,进行操作时是先赋值,后运算;而“++a”类操作则正是与此相反。...以c=a++为例,由上述结论可知,这个表达式实际上是先将a值赋给c,这样c就等于21,而后续符号操作则直接是a,所以经过这个表达式之后,a值实际上变成了22。由此,则可以推出下面的一系列内容。...这篇文章主要是针对c语言小白,各位大神还请借道哈,不要喷我,如果有错误还请帮忙指出,不胜感激。 本人也是小白一枚,愿与诸君共同进步,通向成神之路!!!

2.6K30

C语言printf中运算符

解析: C语言中,++i表示先运算后赋值,i++表示先赋值后运算。这个知识点相信只要会点编程的人都知道。 而C语言中,printf中减运算符却有另一片天地。...其实上面例子如果将C语言代码换成汇编语言,能清晰看出来代码执行流程,只是放出来汇编代码怕是不懂汇编就更懵了。 所以这里我就不放汇编了,直接用最通俗方式记录我理解。...,编译器会将运算前值存储在寄存器中,以便在运算完成之后运行输出,所以后面输出其实是寄存器中之前存储下来值。...而像++i这样先运算后赋值情况则无需寄存器来保存运算之前值,因为运算之前值保存下来毫无意义,它会输出运算之后值。 i--和--i同理。...dx=ax+1=6 movl %edx, -4(%rbp) // 将dx寄存器值赋值给i, i=dx=6 ++i汇编代码: addl $1, -4(%rbp) // 将i值增加1赋值给i, i=

80010
您找到你想要的搜索结果了吗?
是的
没有找到

2.1 C++减运算符

运算符 在C++中,常常使用运算符(++),来使变量1 i++ int i=3; int j; i++; j=i++; 在使用i之后,先让i值加1,比如上述代码,执行j=i++之后,...j值是3,i值才是4 ++i int i=3; int j; ++i; j=++i; 在使用i之前,先让i值+1,上述输出j后,j值为4 减运算符 i-- int i=3; int j;...执行后,j值为2 在使用减运算符时候要注意以下几点 减运算符都是用于变量,不能用于常量或者表达式。...减运算符结合方向规则是右向左,和前面小节将自左向右正好相反。 减运算符在C++中主要用于循环语句中,使循环变量值自动+1或者-1。...减运算符也用于指针变量中,可以使指针指向下一个地址,和C语言类似。

6683230

EasyC++20,C++中

这是EasyC++系列第20篇,简单聊聊C++当中减。 减 基本用法 减是C++当中两个使用频率非常高运算符,不仅在循环当中用到,在日常代码当中也经常使用。...甚至C++这个名称由来都和运算符有关,表示C语言升级版。当然这也是C#名字由来,#这个符号表示4个叠加加号……不得不吐槽这微软恶趣味。...我们都知道有两种写法,一种是i++另外一种是++i。这两种写法对于i这个变量最终结果来说是一样,都是了1,但是对于这个操作发生时间,则有很大差异。...对此,C++当中有一个叫做顺序点概念,顺序点指的是程序执行过程中一个点。在C++当中语句中分号就是一个顺序点,在程序处理下一条语句之前,赋值运算符、减运算符执行所有修改都必须完成。...意味着我们在执行cout之前,cnt变量就已经完成了。这进一步说明了while(cnt++ < 10)本身就已经是一个完整表达式了。因此在这个表达式执行之前,C++就会完成操作。

61830

C语言 枚举类型在VS2010上无法实现减操作

如果一个变量只有几种可能值,那么这个变量可以被定义为枚举类型。 枚举意思就是把可能值一一列举出来,那么变量值也只限于列举出来范围中。...5.C99标准把枚举类型作为一种整型数据,所以枚举类型是应该支持加一操作,《谭浩强 C程序设计》中也应用了枚举类型操作,比如我们写这样一个代码: #include int...black;i++) { printf("当为第%d个颜色\n",i); } getchar(); return 0; } 这时应该打印出4列话才对,但是我用vs2010 把文件后缀改成.c,...所以我只能理解为微软对C语言支持不是太好,C99中一些特性并没有支持。...换个角度想,其实应用枚举类型加操作本身也不太好,当我们使用默认顺序而不是在声明时指定,枚举元素才是连续,指定后元素将不再连续,比如 #include int main() {

71920

C语言定义

专栏系列:【C】系列  ‍ Gitee:謓泽 (wsxsx) - Gitee.com⭐️ 点赞+ 收藏⭐️+ 留言​ ---- 定义不带参数         说明:定义指令 #define...不带参数定义方式如下(这也是我们经常用到定义) #define 名 字符串 //没有分号,说没有分号倒不如说最好不要加分号         这里说下原因吧:因为定义它并不是C语言语句,所以不用加分号...名实际上就是一个标识符,必须要符合C语言当中标识符语法规定。         标识符规则:字母、数字、下划线,不以数字开头,注意:关键字不能作为标识符!...命名事项         相信有些小伙伴已经发现了这个函数使用语法和函数是非常类似滴。所以语言本身就会没办法帮我们区分二者一些使用。...,那么现在我们用BSC充当C++风格注释。

27410

C语言定义

简单定义 简单定义有如下格式: [#define指令(简单)]  #define 标识符替换列表 替换列表是一系列C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号...虽然简单常用于定义常量名,但是它们还有其他应用。 4) 、可以对C语法做小修改。实际上,我们可以通过定义方式给C语言符号添加别名,从而改变C语言语法。...例如,对于习惯使用Pascalbegin和end(而不是C语言{和})程序员,可以定义下面的: #define BEGIN { #define END } 我们甚至可以发明自己语言。...##运算符 在C语言中,"##"被称为 连接符(concatenator),它是一种预处理运算符, 用来把两个语言符号(Token)组合成单个语言符号。...实际上,C语言库提供了一个通用、用于错误检测——assert 再如: #line 838 "Zend/zend_language_scanner.c" #line预处理用于改变当前行号

6.1K10

excel编程 c语言,(巨集)

用途在于自动化频繁使用序列或者是获得一种更强大抽象能力——但这常常是一回事。 计算机语言C语言或汇编语言有简单系统,由编译器或汇编器预处理器实现。...C语言预处理器工作只是简单文本搜索和替换,使用附加文本处理语言如M4,C 程序员可以获得更精巧。...Lisp类语言如Common Lisp和Scheme有更精巧系统: 行为如同是函数对自身程序文本变形,并且可以应用全部语言来表达这种变形。...一个 C 可以定义一段语法替换,然而一个 Lisp 却可以控制一节代码计算。 获得了控制代码执行顺序(见惰性计算和非限制函数)能力,使得新创建语法结构与语言内建语法结构不可区分。...== 语言 == 语言是一类编程语言,其全部或多数计算是由扩展完成语言并未在通用编程中广泛使用,但在文本处理程序中应用普遍。

1.6K20

C++ 减运算符重载和性能分析

— 1 — 重载形式 运算符和减运算符是有「前置」和「后置」之分,如: a++ // 后置运算符 ++a // 前置运算符 b-- // 后置减运算符 --b // 前置减运算符...为了区分所重载是「前置」运算符还是「后置」运算符,C++规定: 「前置」运算符作为一元运算符重载,重载为成员函数形式如下: // 前置运算符重载函数,函数参数是空 T & operator+...那么问题来了: 为什么「前置」运算符返回是引用 & ? 为什么「后置」运算符返回是普通对象(临时对象)? 主要是因为为了保持原本 C++ 前置和后置运算符特性。...「后置」减运算符重载,就有点不同,例如后置++,是先参与运算,再进行,所以返回值是没对象,具体实现如下: ?...---- — 4 — 性能比较 从上面的例子,我们看到「后置」运算符重载函数执行步骤: 先要产生一个临时对象来保存未减前对象; 接着成员变量减; 最后返回修改前对象(临时对象);

1K20

C语言 | offsetof和container_of

今天分享C语言两个,这两个包含了指针和结构体知识,非常具有代表性。另外,这个题目曾经是大疆无人机一道笔试题,可见,这两个C语言基础还是有一定要求。...废话不多说,今天要说两个分别是offsetof和container_of,第一个是用来计算结构体中某个成员相对于结构体偏移量,第二个是已知指向结构体某个成员指针,来计算结构体指针。...我们知道,C语言给我们提供了一个很好方式去访问结构体成员,比如结构体变量我们可以用点.去访问,结构体指针我们可以用->去访问,这两种访问方式本质上是通过指针进行访问,只不过这个过程是编译器帮我们处理了...,还要知道变量类型,所以C语言帮我们考虑了这一点,使用简单方式就行了。...既然C语言帮我们做了计算偏移量这件事情,那我们是不是可以反过来利用一下它,先通过点方式访问变量,再对变量进行取地址运算,减去结构体首地址不就是变量偏移量了吗?

2.1K30

C语言定义技巧

C语言定义技巧(常用定义) 写好C语言,漂亮定义很重要,使用定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用得定义。...((c) - 0x20) : (c) ) 13、判断字符是不是10进值数字 #define  DECCHK( c ) ((c) >= '0' && (c) <= '9') 14、判断字符是不是16...进值数字 #define  HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\                        ((c) >= 'A' && (c...记住编译程序 也许还提供其它预定义名。 _ LINE _及_ FILE _指令在有关# line部分中已讨论,这里讨论其余名。...加多一层中间转换. 加这层用意是把所有参数在这层里全部展开, 那么在转换那一个(_STR)就能得到正确参数.

2.3K10

简述C语言定义使用

我们仅需要改变一个定义,就可以改变整个程序中出现所有该常量值; 可以帮助避免前后不一致或键盘输入错误; 控制条件编译; 可以对C语法做小修改; 带参数 带参数仍要遵循上述规则,区别只是名后面紧跟圆括号中放置了参数...),5+15+1=11,而不是36 CUNT(++x)被替换成++x*++x即为6*7=42,而不是想要6*6=36,连续前置加加两次 解决办法: 用括号将整个替换文本及每个参数用括号括起来print...feral) foo(wolf); else bin(wolf); 判断语言被扩展成: if (!...,但是C++/C程序员不要定义很复杂定义应该简单而清晰。.../content/13/0125/13/10906019_262310086.shtml 高质量程序设计指南C++/C语言第3版 https://www.cnblogs.com/southcyy/p/10155049

1.6K20

sizeof遇到问题

1.导言 本来是在C++群里回答一个很简单类型转换后判断字节问题,后来发现代码中有个点还蛮有意思,所以记录下来 2.场景 有这个代码 int a = 5; sizeof(a++); cout <<...a << endl; 我发现a竟然输出5,来想后不是变成6吗 这是因为 sizeof 是一个编译时运算符,它不会对其操作数进行求值。...在这个例子中,sizeof(a++) 只会返回变量 a 大小,而不会执行 a++ 这个操作。所以,当输出 a 值时,它仍然是初始值 5。...编译器会根据操作数类型来确定 sizeof 结果,而不是根据操作数值。因此,即使操作数是一个表达式,sizeof 也不会对它进行求值。...也可以理解为sizeof里面如果有等号的话,等号右边东西都是没用

7110

C语言 嵌套展开规则

第一时间看干货文章 1 C语言中,是在预编译时用体内容“文本替换”代码中。...先讲一些嵌套展开规则: 一般展开规律像函数参数一样:先展开参数,再分析函数,即由内向外展开; 当中有#运算符时候,不展开参数; 当中有##运算符时候,先展开函数,再分析参数; ##运算符用于将参数连接到一起...利用括号将整个定义内容括起来,保证整个定义中表达式优先运算。 嵌套: 嵌套是使用难点,也是易错点。...原文:https://zhuanlan.zhihu.com/p/344240420 本文整理网络,版权归原作者所有,如有侵权,请联系删除。...往期推荐 分享一个开源QT串口示波器 C语言回调函数,提升C技巧必备 用C语言实现状态机设计模式 stm32可以跑Linux操作系统吗?

1.3K20

MySQL探究

2.5 锁MySQL锁是指在使用主键(Auto Increment)时,为了保证唯一性和正确性,系统会对字段进行加锁。这样可以确保同时插入多条记录时,每条记录都能够获得唯一增值。...:为一些(但不是全部)新行指定自动增量值2.5.2 锁原理1)插入原理MySQL实现机制是使用了一个名为"auto-increment lock"互斥锁。...锁确保了插入记录唯一性和正确性,避免了并发插入产生冲突。但同时也会带来一些性能上影响,因为并发插入操作需要等待锁释放。因此,在高并发场景下,可能需要考虑使用其他方案来避免锁成为瓶颈。...Tips:锁跟事务无关,即使多个insert语句存在同一个事务中,每次insert都会申请最新锁来获取最新AUTO_INCREMENT值;获取到增值后释放,而不是事务结束释放;2)锁表锁需要注意是...这也是InnoDB默认值;Simple inserts:InnoDB能够预先知道要插入行数,因此产生锁只会锁住对应那些id(页锁),避免表级别的锁Bulk Inserts:InnoDB无法预知要插入

8921

MongoDB id 生成

概述 我们使用 MySQL 等关系型数据库时,主键都是设置成。 但在分布式环境下,尤其是在分库分表以后,单纯主键会产生冲突,需要考虑如何生成唯一 ID。...缺点 虽然在同一个进程内一秒内生成多个主键 id 是,但是在数据库全局是没有这样规律。 有时,能够完全 id 对于应用业务来说是非常重要。...MongoDB 允许我们自己生成 _id,但是这样唯一性压力就又来了,在并发环境下保证 ID 严格与避免 ID 冲突有时是需要丰富经验。 5....自己生成 id — findAndModify 虽然已经有很多生成 id 方案可供选用,如依赖 redis 等,但 MongoDB 本身提供了原子操作,我们可以通过 MongoDB 提供原子操作来实现...id

7.7K30
领券