C语言中多个自增自减运算规律
探讨C语言中自增、自减运算符
j( ++i++i+; =i 源自( )( ) + + + ② pit“= , %dn , ) r f i%d = k”i ; n( j
i3 - :
pi “= %d , +++ i (+) r i%d = ”,十 i(+) 十 i; n i + )
它们的结合方向 , 否则就会 出现错误 。 自增与 自减运算符是 c语言特 有 的两 种 2运用 自增 、自减运算符运算规 则时发现 较常用的运算符 , 只能用于变量 , 而不能不能用 的问题 于常量和表达式 。 自增运算使单个变量的值 增 笔者在教 学过程 中运用运用 自增 、自减运 1, 等同于变量 a a 1 = + ;自减运算使单个 变量的 算符运算规则 分析下 面程序时发现 : 值减 1, 等同于变量 a a 1 = + 。自增与 自减运算符 m iO an
1自增 ( + 、 + ) 自减 ( ) 法 与 运算 规 则 一 用
有两种用法 : a. 前 置 运 算 — — 运 算 符 放 在 变 量 之 前 : (itI3 ; n _ j+ i(+)(+) = +++ i + i( + ; p n (i%d = \”i) i f f“_ %dn , ;
责任编辑 : 宋义
一
95 —
a ,=1 =6 b 8 a 6, 9 = b=
该不 同 ; 同样 , p n O 在 f f 函数 中 , i 其所遵循 的运 算规则与前两者又有所不 同。究其原因, 先用 “ 后变 , 先变后用 ” 中的“ ” 后” 先 和“ 是一个模糊 的 概念 , 很难给出顺序或时 间上的准确定论 。 先” “ 到什么时候 ,后” “ 到什么程度? 通过查阅此 方面 的资料 , 发现不同的知名教授也有不同的结果 , 但并不是他们有误 ,而是这类表达式太依 赖编 译 器 , 同 的 运行 环境 就 有 不 同的 结 果 。 因 此 , 不 不 宜 在 编 程 实 践 中使 用 类 似 表 达 式 。 总之, 自增 、 自减 运算符 是 C程 序设计 语 言中特有的且常用 的运算符 。但对于初学者而 言,比较难以理解这两个运算 符的运算 实质。 笔者希望对此所作 的探讨 ,能够有助于初 学者 对 自增 、 自减运算符的使用规则的正确理解 。 同 时, 笔者 希望用 C语 言设计程序时 ,为了保证 可靠性 , 程序必须 清晰易读 , 而表达式的清晰易 读是十分重要的方 面。因此 , C程序设计中 , 在 要慎重使用 自增 、 白减运算符 , 特别是在一个表 达式 中不要多处出现变量 的 自增 、 自减等运算 。
C语言中自增(自减)运算解析
C语言中自增(自减)运算解析
姜红
【期刊名称】《湖北成人教育学院学报》
【年(卷),期】2009(015)002
【摘要】C语言教学中,自增(自减)运算是一个重点,但对初学者来说又是一个难点.自增(自减)运算符是一个单目运算符,遵循"右结合性".在不同的环境中,所进行的运算规律有所区别,本文研究解析了自增(自减)运算的规律.
【总页数】2页(P120-121)
【作者】姜红
【作者单位】长江职业学院,湖北武汉,430074
【正文语种】中文
【中图分类】TP3101.2
【相关文献】
1.C语言中自增自减运算符的应用与解析 [J], 李彩玲
2.C语言自增(自减)运算符运算规律的探讨 [J], 唐婷;吕浩音
3.C语言中自增自减运算符在表达式和函数中的应用 [J], 王象刚
4.解析C语言中自增自减运算符 [J], 刘敏
5.C语言自增自减运算符的解析与应用 [J], 雷玉梅
因版权原因,仅展示原文概要,查看原文内容请购买。
C语言中的自增_自减运算符
262500; 2 山东正元地理信息工程有ຫໍສະໝຸດ 责任公司潍坊分公司 , 山东 潍坊
摘要 : 本文根据笔者多年的 C 语言编程经验 , 详细归纳了 + + / - - 运算符在解题过程中应注意的多个 方面的事项, 是对教材的一个非常有益的补充 , 可用于 C 语言教学的参考, 也有助于初学者的自学。 关键词: 前置; 后置; + + / - - 运算符; 形参; 实参 中图分类号 : TP312 文献标识码 : B 文章编号 : 1009- 2080( 2006) 04- 0017- 02
收稿日期 : 2006- 12- 06 作者简介 : 孙义欣 ( 1968~ ) , 男 ( 汉 族) , 山东 寿光人 , 潍坊教育学院计算机工程系讲师 .
17
2006 年第 4 期
孙义欣
许卫华
孟令波 : C 语言中的自增 / 自减运算符 的使用特点 , 要综 合起来考虑问题。 六、 当用于函 数的实参时 , 应注意实参向形参赋值的顺序 C 标准没有具体规定函 数参数求值的 顺序是自 左至右 还 是自右至左。但每个 C 编译 程序都 有自己 的顺 序 , 在 有些 情 况下自左至右和 自右至 左的 结果是 相同 的 , 如 fun( a+ b, b+ c, c+ a) , 但如实际参数含有 + + / - - 运算符 时 , 情 况就有 些 不同了。在 Turbo C 和 MS C 系统中规定函数实参向形参赋 值 时 , 是按照自右而左的顺序 进行赋值的 , 也就是 说最后一个 实 参先把值赋给最后一个 形参 , 倒数 第二个 实参 再把值 赋给 倒 数第二个形参 ! !, 最 后才 把 第一 个实 参 赋给 第一 个 形参。 如果在实参中不涉及到 + + / - - 运算符 , 那么 从前往后和 从 后往前理解都是一样 的。但如 果在 实参中 使用 了 + + / - 运算符 , 那么这个赋 值的过 程就 显得 尤为重 要了。让 我们 来 看下面的这个例子。 int add( int x, int y) { return ( x* y) ; } int main( ) { int i= 5, j= add( i+ + , + + i) ; } 这个调用的过程可以这样来表示 : add( i+ + , 第二步 ∀ x, add( int + + i) ∀ 第一步 int y)
理解编程中的自增与自减运算符的工作原理
理解编程中的自增与自减运算符的工作原理编程中的自增与自减运算符是常见的操作符,用于对变量的值进行增加或减少。
虽然这两个运算符看似简单,但它们的工作原理却需要我们对计算机底层的运作有一定的了解。
在计算机中,变量是存储数据的容器。
当我们使用自增运算符(++)时,它会将变量的值增加1。
同样地,自减运算符(--)会将变量的值减少1。
这两个运算符可以用于整数、浮点数和指针类型的变量。
自增和自减运算符有两种形式:前缀和后缀。
前缀形式将运算符放在变量前面,而后缀形式将运算符放在变量后面。
这两种形式的差别在于它们对变量的操作时间点不同。
以自增运算符为例,前缀形式(++i)会在使用变量之前将其值增加1,而后缀形式(i++)会在使用变量之后再将其值增加1。
这意味着前缀形式会先执行自增操作,然后返回增加后的值;而后缀形式会先返回变量的原始值,然后再执行自增操作。
为了更好地理解自增和自减运算符的工作原理,我们可以通过一个简单的例子来说明。
假设有一个整数变量i,其初始值为0。
如果我们使用前缀自增运算符对i进行操作,代码如下:```c++int i = 0;int result = ++i;```在这个例子中,++i会将i的值增加1,并返回增加后的值。
因此,result的值将为1。
相反,如果我们使用后缀自增运算符,代码如下:```c++int i = 0;int result = i++;```在这个例子中,i++会先返回i的原始值0,然后再将i的值增加1。
因此,result的值仍然为0。
自减运算符的工作原理与自增运算符类似。
无论是前缀形式还是后缀形式,它们都会将变量的值减少1,并返回减少后的值或者原始值。
自增和自减运算符的工作原理与计算机底层的运作密切相关。
在计算机内部,变量的值是以二进制形式存储的。
自增和自减运算符会直接对变量的二进制表示进行修改,以实现增加或减少的效果。
此外,自增和自减运算符还可以与赋值运算符结合使用,形成复合赋值运算符。
c语言加加减减运算符
c语言加加减减运算符C语言中的加加减减运算符是程序员经常使用的一种运算符。
它们的作用是对变量进行自增或者自减操作,可以简化程序的编写过程,提高代码的可读性和执行效率。
加加运算符(++)是一种自增运算符,用于将变量的值增加1。
它可以用在变量前面(前缀形式)或者变量后面(后缀形式)。
前缀形式表示先对变量自增,再使用变量的值;后缀形式表示先使用变量的值,再对变量自增。
例如,假设有一个整型变量a的初始值为5,我们可以使用加加运算符对a的值进行自增操作。
如果使用前缀形式的加加运算符,则可以写成++a;如果使用后缀形式的加加运算符,则可以写成a++。
无论是前缀形式还是后缀形式,都会将变量a的值增加1。
下面是一个示例代码,演示了加加运算符的使用方式:```#include <stdio.h>int main() {int a = 5;printf("前缀形式自增:%d\n", ++a);printf("后缀形式自增:%d\n", a++);return 0;}```在上述代码中,首先定义了一个整型变量a并初始化为5。
接着使用printf函数分别输出了前缀形式和后缀形式的自增结果。
结果为6和6,这是因为前缀形式的加加运算符先对变量a进行自增操作,再获取其值;后缀形式的加加运算符先获取变量a的值,再对其进行自增操作。
减减运算符(--)与加加运算符类似,是一种自减运算符,用于将变量的值减少1。
它也可以用在变量前面(前缀形式)或者变量后面(后缀形式)。
前缀形式表示先对变量自减,再使用变量的值;后缀形式表示先使用变量的值,再对变量自减。
下面是一个示例代码,演示了减减运算符的使用方式:```#include <stdio.h>int main() {int a = 5;printf("前缀形式自减:%d\n", --a);printf("后缀形式自减:%d\n", a--);return 0;}```在上述代码中,同样定义了一个整型变量a并初始化为5。
C语中的自增自减
C语中的自增自减摘要运算符多、操作灵活是C语言的一大特色。
在诸多运算符中,最难理解、最容易出错的便是自增、自减运算符。
本文就这两个运算符使用中应注意的问题进行了分析介绍。
关键词C语言自增运算符自减运算符Points for Attention of Using Auto-increasing and Auto-decreasing Operators in Language CWang HongAbstract:Many operators and convenient operation characterize language C. Among those operators, the most difficult to understand and the easiest to mistake are auto-increasing and auto-decreasing operators. This paper analyses the notices in using these two operators.Key words:Language C auto-increasing operators auto-decreasing operators在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。
变量i被称为“计数器”,用来记录完成某一操作的次数。
C语言为这种计数器操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。
它们是从右向左结合的一元算术运算符,优先级为2。
学习和应用这两个运算符时应注意以下几点:1注意表达式的值和变量值的区别以自增运算符为例,当自增运算符++作用于一个变量时,例如:当i=3时++i这个算术表达式的值为4,同时变量i的值也由原来的3改变为4。
一般情况下,计算表达式后不改变变量本身的值,而++运算符和--运算符组成的表达式计算后,则改变变量的值,这称为运算符的副作用。
自增自减运算
SCAU-PPT 2013-10例题“i=3,j=i+++i+++i++”用不同的编译器得出的结果不一样,具体步骤大家可通过debug追踪分析。
先了解以下知识:一、C语言中未定义表达式j=i+++i+++i++未定义是ANSI C标准中并没有定义。
未定义表达式在不同的编译器下可能会给出不同的结果。
例如:(1) TC和Turbo C的结果一样,因为二者的内核差不多,它们执行同样的原则。
(2) 由于在VC开发升级过程时,与 GCC互相借鉴,所以VC大多数情况下和GCC一样。
由于VC更主流,因此,C/C++以VC为准。
若出现类似的未定义行为的语句,按照主流的解释(所谓的主流解释,不过是臆断或者从主流编译器结果推论出来的,并不能作准),有疑惑的时候,用VC验证,符合VC就对了。
(VC结果基本上认为是标准答案,比如全国计算机等级考试C/C++语言也是用VC)注意:标准C/C++语言中不推荐写这样的语句“j=i+++i+++i++”,玩玩可以,若做正规项目就不要用上述危险的代码。
二、C编译器的贪吃规则+求值顺序1、贪吃规则:编译器读程序时,努力把字符拼成符号,例如“i+++i+++i++”读入过程如下:首先读入“i”,然后读入“+”,此时编译器做出判断,看接下来的一个字符能不能和前面的组成符号,发现是“+”,则继续读入“+”组成符号“++”,这就是所谓的贪吃规则。
于是,编译器把“i++”看成一个整体,整个表达式从左到右按上述方式一直读下去,最后可写成“j=(i++)+(i++)+(i++);”。
该语句以分号“;”结束,即,遇到分号时赋值结束。
例1:有同学可能要问“i=3,求i++i++i++的值”。
解释:其实,i++i++i++不对,上述写法编译器会报错。
2、求值顺序:自增运算符“++”的优先级> 算木运算符“+”的优先级。
虽然“i++”和“++i”的优先级相同,但它们同时出现时,“i++”的优先级>“++i”的优先级,关于这点大家可以通过实践去验证。
C语言中自增自减运算符教学探究-8页精选文档
C语言中自增自减运算符教学探究0引言C语言编程设计中,若合理使用自增自减运算符,则可以节省代码,提高效率;若不能正确理解和掌握,则容易造成错误,这往往让学生初学时甚是费解。
教学中,有必要对其进行细致分析,让学生理解并掌握自增自减运算符的使用方法和技巧。
1自增自减运算符基本知识C语言程序设计中提供了两个用于变量递增和递减的特殊运算符。
使单个变量的值增加1的运算符称之为自增运算符,用“++”表示;使单个变量的值减少1的运算符称之为自减运算符,用“--”表示。
自增自减运算符都是单目运算符,即只能对一个对象施加运算,运算结果仍赋予该对象,即结果保存在原变量的存储单元中。
例如,int i=2; i++;执行i++后,i=3。
此时,原变量i存储单元中存放的值变为3。
这里i++等价于i=i+1,当然,i--就等价于i=i-1。
自增自减运算符的操作对象只能是变量,而不能是常量或表达式。
只要其运算的对象是标准的变量,无论是整型、实型或是枚举型均可作为运算对象,而常量和表达式无存储单元可言,自然不能做自增自减运算。
例如:++n、i--合法,而++10、(i+j)++非法。
因为若是常量,常量的值无法改变,无法自加1;若是表达式,如(i+j)++,假如i+j=5,自增后的值为6无变量空间可供存放,所以是非法的表达式。
自增自减运算符包括两种情形:前置式(++i,--i)和后置式(i++,i--)。
前置式和后置式的含义分别为:++i:变量i先自增1,然后再使用该变量i的值;--i:变量i先自减1,然后再使用该变量i的值;i++:先使用变量i的值,然后变量i再自增1;i--:先使用变量i的值,然后变量i再自减1。
即前置运算是“先变后用”,而后置运算是“先用后变”。
当自增自减表达式作为单一语句出现时,二者没有区别,但把它们引用在表达式中则有明显区别。
例如:{int i=9; x=i++; y=i;}的执行结果x=9,y=10,后置运算是“先用后变”。
解析C语言中自增自减运算符
解析C语言中自增自减运算符作者:刘敏来源:《电脑知识与技术》2010年第17期摘要:C语言中自增自减运算符的运算规则是比较灵活的,它在不同的表达式或不同的位置上的运算规则都有所区别。
该文从3个方面及10个典型实例剖析了自增自减运算符的运算规律。
关键词:C语言;自增自减运算符;优先级;前缀自增(减);后缀自增(减)中图分类号:TP312文献标识码:A文章编号:1009-3044(2010)17-4671-03C语言是计算机专业重要的基础课程,由于C语言简洁、灵活、运算符丰富,功能强大,而深受广大计算机应用人员的喜爱,也正因为它的灵活多变,故不易掌握。
C程序设计语言中有大量的运算符,其中的自增运算符++和自减运算符--是C语言中特有的两个运算符、自增、自减运算符在C程序中是十分常见的,也是全国计算机等级等各类考试中常见题目,尤其是自增自减表达式的结果,往往让初学者摸不着头脑,但是如果没有透彻掌握这两个运算符的含义及运算实质,使用时可能会使整个程序结果事与愿违。
本文以win-tc为运行环境,浅析自增自减运算符在不同环境下的运行规律。
1 自增++自减--运算符的运算规则在C语言程序设计中,自增运算符为“++”及自减运算符“--”是非常常用的算术运算,也是比较特殊的两种运算符, 它们的作用分别是使变量的值增加1和减少1,结果均保存在原变量中,其功能相当于加、减表达式的简写形式,例如i++相当于表达式i=i+1,--i相当于i=i-1。
它是一个单目运算符,只能作用于变量进行运算,而不能用于常量或表达式,该变量通常是整型或者是字符型。
如a++或b--都是合法的,而3++或(a+b)++都是不合法的。
由于自增运算符是在表示在原来变量的基础上自加1,最后的结果还是保存在原来的变量中,假如是常量,常量的值不能改变,无法自加1,不符合逻辑要求;若是表达式,如(a+b)++,假如a+b=10,自增后的值11又不知保存到那个内存空间去,无变量空间可供存放,所以是非法的表达式。
C 自增运算符与自减运算符
C 自增运算符与自减运算符C语言提供了两个用于变量递增与递减的特殊运算符。
自增运算符++使其操作数递增1,自减运算符使其操作数递减1。
我们经常使用++运算符递增变量的值,如下所示:if (c = '\n')++nl;++与--这两个运算符特殊的地方主要表现在:它们既可以用作前缀运算符(用在变量前面,如++n)。
也可以用作后缀运算符(用在变量后面,如n++)。
在这两种情况下,其效果都是将变量n的值加1。
但是,它们之间有一点不同。
表达式++n先将n的值递增1,然后再使用变量n 的值,而表达式n++则是先使用变量n 的值,然后再将n 的值递增1。
也就是说,对于使用变量n的值的上下文来说,++n和n++的效果是不同的。
如果n的值为5,那么x = n++;执行后的结果是将x的值置为5,而x = ++n;将x的值置为6。
这两条语句执行完成后,变量n的值都是6。
自增与自减运算符只能作用于变量,类似于表达式(i+j)++是非法的。
在不需要使用任何具体值且仅需要递增变量的情况下,前缀方式和后缀方式的效果相同。
例如:if (c == '\n')nl++;但在某些情况下需要酌情考虑。
例如,考虑下面的函数squeeze(s, c),它删除字符串s 中出现的所有字符c:/* squeeze: delete all c from s */void squeeze(char s[], int c){int i, j;for (i = j = 0; s[i] != '\0'; i++)if (s[i] != c)s[j++] = s[i];s[j] = '\0';}每当出现一个不是c 的字符时,该函数把它拷贝到数组中下标为j 的位置,随后才将j 的值增加1,以准备处理下一个字符。
其中的if语句完全等价于下列语句:if (s[i] != c) {s[j] = s[i];j++;}我们在第1章中编写的函数getline是类似结构的另外一个例子。
C语言中自加和自减运算符(a++、++a、a--、--a)
C语⾔中⾃加和⾃减运算符(a++、++a、a--、--a) 以⾃增运算符为例,当⾃增运算符++作⽤于⼀个变量时,例如:当i=3时++i这个算术表达式的值为4,同时变量i的值也由原来的3改变为4。
⼀般情况下,计算表达式后不改变变量本⾝的值,⽽++运算符和--运算符组成的表达式计算后,则改变变量的值,这称为运算符的副作⽤。
这类运算符在计算表达式时,⼀定要注意区分表达式的值和变量的值。
2 注意前缀运算和后缀运算的区别 仍以⾃增运算符为例,该运算符可作⽤在变量之前,例如前⾯所讲的++i,称为前缀运算;也可作⽤在变量之后,例如i++,称为后缀运算。
在这两种运算中,表达式的值不同:前缀运算后,表达式的值为原变量值加1;后缀运算后,表达式的值仍为原变量值;⽽变量值不论前缀运算还是后缀运算都加1。
⾃减运算符与⾃增运算符类似,只要将加1改为减1即可。
即前缀运算是“先变后⽤”,⽽后缀运算是“先⽤后变”。
3 注意运算符的运算对象 ⾃增、⾃减运算符只能作⽤于变量,⽽不能作⽤于常量或表达式。
因为⾃增、⾃减运算符具有对运算量重新赋值的功能,⽽常量、表达式⽆存储单元可⾔,当然不能做⾃增、⾃减运算。
只要是标准类型的变量,不管是整型、实型,还是字符型、枚举型都可以作为这两个运算符的运算对象。
如以下四个表达式都是合法的:i+++j++、++i+(++j)、++a+b++、++array[--j];⽽++6、(i+j)++、‘A’++、++i+++j、(&p)++这五个表达式却是不合法的。
为什么i+++j++合法,⽽++i+++j却不合法?C的编译器对程序编译时,从左到右尽可能多地将字符组合成⼀个运算符或标识符,因此i+++j++等效于(i++)+(j++),两个“++”作⽤的对象都是变量,这是合法的;⽽++i+++j等效于++(i++)+j,第1个“++”作⽤的对象是表达式“i++”,这是不允许的。
4 注意运算符的结合⽅向 表达式k=-i++等效于k=(-i)++还是k=-(i++)?因为负号运算符和⾃增运算符优先级相同,哪⼀个正确就得看结合⽅向。
C语言自增自减运算符的应用
C语⾔⾃增\⾃减运算符的应⽤2019-06-27摘要: Ca语⾔的⼀个主要特点是运算符丰富、范围⼴。
灵活地使⽤各种运算符可以实现在其它⾼级语⾔中难以实现的运算。
本⽂主要对C语⾔中⾃增、⾃减两个运算符的使⽤作详细说明。
关键词: C语⾔⾃增、⾃减运算符功能运算规则C语⾔中的运算符⾮常丰富,把除了控制语句和输⼊输出以外的⼏乎所有的基本操作都作为运算符处理,灵活使⽤各种运算符可以实现在其他⾼级语⾔中难以实现的运算。
在这些运算符中,最难理解、最易出错也最为灵活的便是⾃增、⾃减运算符。
下⾯我详细归纳了使⽤⾃增、⾃减运算符时的注意事项,并结合运算符的优先级和其本⾝的特点,对Turbo C环境下的⾃增、⾃减运算符的功能与运算规则加以分析。
1.⾃增、⾃减运算符的作⽤及形式C语⾔中的⾃增运算符“++”和⾃减运算符“--”的作⽤是使运算对象的值增1或减1,如i++,相当于i=i+1;i--,相当于i=i-1。
因此,⾃增、⾃减运算本⾝也是⼀种赋值运算,其运算对象只要是标准类型的变量,不论是字符型、整型、实型或是枚举型都可作为运算对象,⽽由于常量和表达式不占存储单元,因此不能使⽤常量或表达式作运算对象,如1++、(a+b)--等都是⾮法的。
⾃增、⾃减运算符有两种使⽤形式:前置式(++i,--i)和后置式(i++,i--)。
前置式中先使i加减1,再使⽤i,后置式中先使⽤i,再使i加减1。
2.⾃增、⾃减运算符的应⽤很多C语⾔教材和参考书都说明⾃增、⾃减运算符具有“从右向左”的结合性,并且由于操作数只有⼀个,属于单⽬操作,因此优先级也⾼于其它双⽬运算符和三⽬运算符的优先级。
但在实际的编程中我们发现,⾃增、⾃减运算符的运算规则在不同的表达式中也不尽相同。
下⾯我们就从⾃增、⾃减运算符的以下⼏点应⽤来进⾏分析。
2.1⾃增、⾃减运算符在赋值表达式中的应⽤。
例1:main(){int i=1,j=2,k;k=i+++j;printf("k=%d,i=%d,j=%d\n",k,i,j);}这⾥的i+++j是理解成i+(++j),还是理解成(i++)+j呢?Turbo C编译处理将⾃左向右解释为(i++)+j,⽽不是i+(++j),因此程序运⾏结果为:k=3,i=2,j=2。
C语言程序设计(自增、自减运算符)
3.2.2自增、自减运算符在循环结构中会经常碰到某一个变量加1再赋给变量本身的情况,如引例的i=i+1。
在c语言中有专门的运算符来表示这种情况,该运算符称为自增运算符,形式为++,含义是使变量自加1,如i++表示的含义是变量i加1再赋给本身,即i++等价于i=i+1,但前者的执行效率高于后者,跟自增运算符类似的还有自减运算符,形式为--,如i--表示变量i减1再赋给本身,即i--等价于i=i-1。
自增自减运算符是单目运算符,它们只能作用于变量。
i++和++i的区别是:i++是i 参与运算后i的值再自增1(即:先引用i,然后i的值再增1),而++i是i自增1后再参与其它运算(即:先使i的值增1,然后再引用i,)。
例如:设i的初值为5,执行完j=i++后j的值为5,i的值为6,而如果i的初值为5,执行完j=++i;后j的值为6,i的值为6。
关于i--和--i的区别同此类似。
注意:自增自减运算符不能作用于常量和表达式,比如:7++和--(a+b)都为错误表达式。
【例3-10】自增自减运算符的使用/*程序名:3_10.c*//*功能:自增自减运算符的使用*/#include<stdio.h>int main(){int i=8;printf("%d,",++i);/*打印自加后的值*/printf("%d,",--i);/*打印自减后的值*/printf("%d,",i++);/*先打印原值,后自加*/printf("%d,",i--);/*先打印原值,后自减*/printf("%d,",-i++);/*先取原值,做负运算并打印,再自加*/printf("%d\n",-i--);/*先取原值,做负运算并打印,再自减*/return0;}该程序的运行结果为:9,8,8,9,-8,-9。
C语言的自增和自减
1、自增和自减运算符是C语言中特有的一种运算符,他们的作用分别是对运算对象做加1和减1运算,其功能如下:++ 自增运算符,如:a++,++a;-- 自减运算符,如:a--,--a。
从表面上看,a++和++a的作用都是使变量a的值加1,但由于运算符++所处的位置不同,使变量a执行加1的运算过程也不同,++a的运算过程是:先使变量a执行a+1的操作,再使用a的值,a++的运算过程是:先使用变量a的值,再执行a+1的操作。
自增和自减运算符只能用于变量,不能用于常数或者表达式。
1、逗号运算符在C语言中,逗号运算符“,”可以将两个或多个表达式连接起来,称为逗号表达式。
逗号表达式的一般形式为:表达式1,表达式2,表达式3....表达式n逗号表达式的运算过程是:先运算表达式1,再计算表达式2,....以此计算到表达式n。
1、条件运算符是C语言中唯一的一个三目运算符,他要求有3个运算对象,用它可以将3个表达式连接构成一个表达式。
条件表达式的一般形式如下:表达式1?表达式2:表达式3其功能是首先计算表达式1,当其值为真(非0值)时,表达式2的值作为挣个条件表达式的值,否则将表达式3的值作为整个条件表达式的值。
C语言中共有6种位运算符,按优先级从高到低依次是:按位取反(运算符~)--左移(运算符<<)--右移(运算符>>)--按位与(运算符&)--按位异或(运算符^)--按位或(运算符|)1、c语言中的移位运算符有两种,左移运算符、右移运算符。
1)左移运算符(<<),其作用是讲一个数的各个二进制位全部左移若干位。
例如a=a<<2,表示将a的二进制数左移2位,若a=15,即二进制数00001111,左移2位得到的结果是00111100,再如a=240,即二进制数11110000,左移2位后得到的结果是11000000.其中高位左移后溢出,被舍弃了,低位以0进补。
C语言中的加加减减
{
int a[5] = {1,8,10,5,2};
int *p;
p = a;
printf("%d\n",--*p);
return 0;
}
执行结果:
*(p++):p与++先结合(而不是*)先结合,这个先是运算符跟谁结合在一起而不是时间的先后
int p = (i--) + (i--) + (i--);
printf("%d\n",p);
printf("%d\n",i);
return 0;
}
执行结果:
说明:这里的i--是先参与运算后再自减1
所以:p = 5 +5 + 5
有三个i--,i自减三次后得到i= 2;、
#include <stdio.h>
int main()
{
int a[5] = {1,8,10,5,2};
int *p;
p = a;
printf("%d\n",(*p)--);
printf("%d\n",*p);
return 0;
}
执行结果:
说明:p = a;
#include <stdio.h>
int main()
{
int a[5] = {1,8,10,5,2};
int *p;
p = a;
printf("%d\n",*++p)
C语言中多个自增自减的运算规律-文档资料
C语言中多个自增自减的运算规律C语言中有两个很奇特的单目运算符:++(自增运算符)和--(自减运算符),自增运算符和自减运算符都有前缀式和后缀式。
这两个运算符在C语句中,尤其是循环语句中使用较为广泛,对于单个的自增运算符或自减运算符,相信大家都易于理解。
但是,C语言允许在一个表达式中使用一个以上的自增运算符、自减运算符,这种灵活性使程序简洁,但同时也会引起副作用。
这种副作用主要表现在:使程序费解,并易于发生误解或错误。
例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一或者干脆回避这类问题。
既然前面提到在一个表达式中可以有多个自增或自减运算符,我们不能总是以费解或避免出错为由来回避这个问题,不用归不用,了解一下这些内容还是相当有必要的。
为了弄清楚C语言中多个自增或自减运算符的运算规律,笔者经查阅大量资料并反复上机验证,总结出在VC++6.0环境下多个自增自减的运算规律。
1 连续多个后缀的运算规律先统一取值后依次自增或自减。
如:#includevoid main(){int a,i=5;a=(i++)+(i++)+(i++);printf(“a=%d,i=%d\n”,a,i);}其运算规律是先对所有的i++统一取值5,然后i依次自增3次,即 a=5+5+5=15,i=5+1+1+1=8。
因此,程序输出结果为:a=15,i=82 连续多个前缀的运算规律前两个连续的前缀(两个连续自增,或者两个连续自减,或者一个自增一个自减),即依次自增(减)后,统一取第二个自增(减)的值,后面的每个自增(减)后即刻取值。
如:#includevoid main(){int a, i=5;a= (++i)+(++i)+(++i);printf(“a=%d,i=%d\n”,a,i);}第一个++i的值为6,第二个++i的值为7,第三个++i的值为8,但第一个++i和第二个++i统一取第二个++i的值7,即a=7+7+8=22,而i的值则依次自增,即i=5+1+1+1=8。
C语言自增自减运算符深入剖析
发布日期:来源:作者:引子语言地自增,自减运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题:<>() *主函数*{;;;()()();()()();("\");} 结果是什么?而后搜了一下后发现,类似地问题很多,也就是说对自增自减运算符感到迷惑是一个普遍存在地问题,基于此,决定对自增自减运算符做个小小地解析,希望能给语言爱好者们提供参考,解决对此问题地困惑.自增自减运算符语法自增运算符使操作数地值加,其操作数必须为可变左值(可简单地理解为变量).对于自增就是加这一点,想大家都不会有什么疑问.问题在于:可以置于操作数前面,也可以放在后面,如:;;表示,自增后再参与其它运算;而则是参与运算后,地值再自增.自减运算符与之类似,只不过是变加为减而已,故不重述.实例剖析下面我们通过一些实例来深入理解自增运算符地特性,自减运算符同理自悟例一:;; ;;(", \", , );对此,想大家都不会有什么困惑,结果就是,;下面我们来做一点小改动:;;;;(", \", , );结果又是多少呢?这里就开始体现出前置与后置地区别了,结果是,.结合此例,我们回头再来理解一下“前置:自增后再参与其它运算;后置:参与运算后,地值再自增”.很明显,;由于是先执行赋值运算,再自增,所以结果是=,=;而;则因先自增,然后再赋值,所以,均为.其实基本道理就这么简单了,但在更复杂点地情况下又会如何呢,请看:例二:;;;;(", \", , );问题又来了,是先自增一次,相加,再自增,然后赋值呢,还是先相加赋值然后自增两次呢.另外,++又将如何表现呢?结果是:,这下明白了,原来地理解应该是执行完整个表达式地其他操作后,然后才自增,所以例子中地=+=;而后再自增次,=;相反,是先自增然后再参加其它运算,所以=+=.到此,是否就彻底明了了呢?然后回到引子中地问题:例三:;;;;(", \", , );有人可能会说,这很简单,我全明白了:=++=,=,=++=,=.真地是这样吗?结果却是:,这下可好,又糊涂了.对于;我们已经没有疑问了,后置就是执行完整个表达式地其他操作后,然后才自增,上例中也得到了验证,但;又该如何理解呢?原理表达式中除了预算法本身地优先级外,还有一个结合性问题.在;中,因为存在两个同级地+运算,根据+运算符地左结合性,在编译时,其实是先处理前面地()这部分,然后再将此结果再和相加.具体过程参见汇编代码:;[][] 第一个[][] 第二个[][][][] 第三个[][] 赋值给另外我们看看;地汇编代码:;[][][][] 赋值给[][] 第一次[][] 第二次[][] 第三次果然不出所料.到此,运算符前置后置地问题应该彻底解决了. 为了验证一下上述结论,我们再看:例四:;;; 七个;(", \", , );(", \", , );规则就是规则,咱地计算机可不是黑客帝国地母体,总是要遵循它地,,一切,恭喜你还生活在世纪地地球,不用担心控制你地思维和生活注:以上结果及解释出自编译器,但对于++这个问题是和编译器地解析有关地,不同厂家可能理解不一致,因手头没有其他开发环境,暂无法做全面分析,本文只是为了说明++,--这运算符地一些特性,尤其是前置后置地区别这个问题.类似地问题如果有困惑,最好是写程序做试验解决,请勿生搬硬套.谢谢!在实际地编程实践中,类似地问题除了要试验搞清外,认为应该尽量避免引入环境相关地编程技巧.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中多个自增自减的运算规律
摘要:c语言允许在一个表达式中使用一个以上的自增运算符、自减运算符,这种灵活性使程序简洁,但同时也会引起副作用。
这种副作用主要表现在:使程序费解,并易于发生误解或错误。
例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一或者干脆回避这类问题。
为了弄清楚c语言中多个自增或自减运算符的运算规律,笔者经查阅大量资料并反复上机验证,总结出在vc++6.0环境下多个自增自减的运算规律。
关键词:自增;自减;运算规律
中图分类号:tp311
c语言中有两个很奇特的单目运算符:++(自增运算符)和--(自减运算符),自增运算符和自减运算符都有前缀式和后缀式。
这两个运算符在c语句中,尤其是循环语句中使用较为广泛,对于单个的自增运算符或自减运算符,相信大家都易于理解。
但是,c语言允许在一个表达式中使用一个以上的自增运算符、自减运算符,这种灵活性使程序简洁,但同时也会引起副作用。
这种副作用主要表现在:使程序费解,并易于发生误解或错误。
例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一或者干脆回避这类问题。
既然前面提到在一个表达式中可以有多个自增或自减运算符,我们不能总是以费解或避免出错为由来回避这个问题,不用归不用,了解一下这些内容还是相当有必要的。
为了弄清楚c语言中多个自增或自减运算符的运算规律,笔者经查阅大
量资料并反复上机验证,总结出在vc++6.0环境下多个自增自减的运算规律。
1 连续多个后缀的运算规律
先统一取值后依次自增或自减。
如:
#include
void main()
{
int a,i=5;
a=(i++)+(i++)+(i++);
printf(”a=%d,i=%d\n”,a,i);
}
其运算规律是先对所有的i++统一取值5,然后i依次自增3次,即 a=5+5+5=15,i=5+1+1+1=8。
因此,程序输出结果为:a=15,i=8
2 连续多个前缀的运算规律
前两个连续的前缀(两个连续自增,或者两个连续自减,或者一个自增一个自减),即依次自增(减)后,统一取第二个自增(减)的值,后面的每个自增(减)后即刻取值。
如:
#include
void main()
{
int a, i=5;
a= (++i)+(++i)+(++i);
printf(“a=%d,i=%d\n”,a,i);
}
第一个++i的值为6,第二个++i的值为7,第三个++i的值为8,但第一个++i和第二个++i统一取第二个++i的值7,即
a=7+7+8=22,而i的值则依次自增,即i=5+1+1+1=8。
因此,程序输出结果为:a=22,i=8
同理,我们再看一个稍复杂的例子:
#include
void main()
{
int a,i=5;
a=(--i)+(++i)+(++i)+(--i);
printf(“a=%d,i=%d\n”,a,i);
}
其运算过程为:a=5+5+6+5=21,i=5-1+1+1-1=5。
因此,程序输出结果为:a=21,i=5
当然,多个自增自减之间的其它算术运算也适用此规律。
如:
#include
void main()
{
int a,i=5;
a=(++i)*(- -i);
printf(“a=%d,i=%d\n”,a,i);
}
其运算过程为:a=5*5=25,i=5+1-1=5。
因此,程序输出结果为:a=25,i=5
3 前后缀混合的情况
3.1 一般情况:表达式中自左向右计算,函数参数列表中自右向左运算。
前缀自增(减)后取值;后缀(或变量)取值依其所处位置而定,有连续多个将统一取值,其自增(减)在语句结束前进行。
如:
#include
void main()
{
int a,i=5;
a=(++i)+(++i)+(i++)+(i++)+(++i);
printf(“a=%d,i=%d\n”,a,i);
}
其运算过程为:a=7+7+7+7+8=36,i=5+1+1+1+1+1=10。
因此,程序输出结果为:a=36,i=10
3.2 前后缀各有一个的情况:如:
#include
void main()
{
int a, i=5;
a=(i++)*(++i);
printf(“a=%d,i=%d\n”,a,i);
}
由于(i++)*(++i)应满足交换率与(++i)*(i++)相同,规定按后者计算,即先计算前缀再计算后缀,故a=6*6=36,i=5+1+1=7。
因此,程序输出结果为:a=36,i=7
当自增(减)出现在函数表达式的参数列表中,它的计算方法与作为普通语句的运算结果是完全不同的。
因此如果函数有多个参数,则参数自右向左计算,如:
#include
void main()
{
int i=5;
printf(”%d,%d\n”, --i, i++*++i );
}
其运算过程为:先计算i++*++i为36,再计算- -i结果为5。
因此,程序输出结果为5,36
3.3 有多个前后缀的情况:++i有两个以上在一起时最左边的连续自增同上述规律二、,其余每个自增后取值,如:
#include
void main()
{
int i=5;
printf(”%d\n”,(++i)+(i++)+(i++)+(++i));
}
计算过程为6+6+6+7=25,因此,程序输出结果为25
再例如:
#include
void main()
{
int i=5;
printf(”%d\n”,(++i)+(++i)+(++i)+(++i)+(i++));}
计算过程为7+7+8+9+9=40,因此,程序输出结果为40
再例如:
#include
void main()
{
int i=5;
printf(”%d\n”,(++i)+(++i)+(++i)+i+(++i)+(++i));}
计算过程为7+7+8+8+9+10=49,因此,程序输出结果为49
3.4 函数参数中有括号时,括号参数优先计算,其余参数仍自右向左计算,如:
#include
void main()
{
int i=9,j=8;
printf(”%d, %d\n”,(++i, j--), ++i);
}
其运算过程为先计算(++i,j--),再计算++i,因此,程序输出结果为8,11
再例如:
#include
void main()
{
int i=9,j=8;
printf(”%d, %d ,%d\n”,(++i, j--), ++i, i);}
注意其运算过程是先计算括号中的值,然后在++i ,i这两个参数中,自右向左计算,即先计算i,再计算++i ,因此,程序输出结果为8,11,10。
3.5 最后i的值等于原值加总自增次数减总自减的次数。
以上规律是在vc++6.0环境下测试总结出来的,在不同的运行环
境下规律可能不一样,需区别对待。
当然,此规律只供探究c语言中多个自增、自减的运算规律,在实际编程中还是应该尽量避免或禁止在一个语句中使用多个自增或自减的这种写法。
参考文献:
[1]陈东方,黄远林.c语言程序设计基础[m].北京:清华大学出版社,2010,3.
[2]谭浩强.c程序设计(第4版)[m].北京:清华大学出版社,2010,6.
作者简介:杨泽明(1970.2-),男,高级教师,网络工程师,学科研究方向:网络安全及程序设计。
作者单位:湖北省襄阳市襄城区职业高级中学,湖北襄阳 441101。