变量自增/自减

2024-08-22

变量自增/自减(精选3篇)

变量自增/自减 篇1

摘要:C语言的内部运算符很丰富, 其中最难理解的是在使用过程中最易得到模棱两可结果的自增自减运算符, 特别是遇到多个自增自减运算符连续出现在表达式中的时候, 结果更是让人无法估测。本文结合词法分析中的“贪心法”对这两个运算符的使用做了详细说明。

关键词:贪心法,自增自减,词法分析

C语言在计算机软件开发中的作用日益重要, 它以独特的魅力征服了很多编程工作者, 已成为世界上广泛流行的、最有发展前途的计算机高级语言。它适用于编写各种系统软件, 也适用于编写各种应用软件。针对C语言的教学, 笔者谈谈对自增自减运算符的几点看法。

一自增和自减运算符的作用和特点

自增运算符 (++) 和自减运算符 (――) 都是单目运算符, 它们的作用分别是使操作数加1和减1, 换句话说:x=x+1;同++x, x=x-1;同――x, 自增和自减运算符可用在操作数之前 (前缀形式) , 也可放在操作数之后 (后缀形式) 。例如:“x=x+1;”可写成“++x;”或“x++;”, “x=x-1;”可写成“――x;”或“x――;”, 但是表达式中这两种用法是有区别的, 首先自增运算符和自减运算符在操作数之前 (前缀形式) “++x, ――x”:先使变量x的值加1或减1, 再使用变量x的值。其次自增运算符或自减运算符在操作数之后 (后缀形式) “x++, x――”:先使用变量x的值, 再使变量x的值加1或减1。

在教学中我们应该注意以下几点: (1) 使运算对象的值在原来的基础上加1或减1是自增运算符和自减运算符的特点。所以自增或自减运算其实和赋值表达式的功能是一样的。 (2) 运算符两边的运算对象的数据类型可以是整型的, 也可以是实型的, 但不能是常量或表达式。所以++5、 (a+b) --等都是不合法的。 (3) 表达式若是由自增或自减运算符构成的, 它的运算符就可以出现在运算对象的前面, 也可以出现在运算对象后面, 也就是前缀和后缀形式都可以, 对于运算对象而言, 结果是一样的, 但从表达式的角度看, 结果就是不一样的。 (4) 从优先级上来看, 运算符“++”和“--”的结合方向是“从右到左”。假设有一表达式-a++, 其中a的初始值为1, 因为在运算符中, 就相当于- (a++) 运算, 结果为-1, 然后a自增为2。

二自增和自减运算符的结合性

自增和自减运算符都是“从右到左”的结合方向, 如果说a=3, 那么计算:-a++, 实际上就相当于计算- (a++) 这个表达式, 这时自增运算符“++”为后缀形式, (a++) 的值为3, 而- (a++) 的值为-3, 然后a的值自增为4。像这种简单的自增自减运算, 我们按运算符的优先级和结合性处理还是比较容易解决的。若是遇到多个自增自减运算符连续出现在表达式中的时候, 结果就可能模棱两可, 有时更是让人无法估测。下面让我们来看一个复杂一些的例子:

例1:a+++++b的含义是什么?

我们为了验证它的含义, 编写了一个小程序:

左值就是可以在“=”左边, 能被赋予值的东西;右值则是在“=”右边, 可以赋值给别人的东西。所以左值必须是有内存空间的东西;而右值则既可以是变量, 也可以是常量和某种表达式, 只要能提供一个值即可。但这个程序是不能通过编译的, 也就是说, 尽管我们可以正确地理解这个表达式, 但在编译过程中会产生错误。为什么a+++++b会编译错误呢?

第一, 编译器在读入此语言时, 遇到连续多个+, 如+++++, 自动识别位 ( (++) ++) +, 即会++比+更优先识别。

第二, ++运算需要左值的。a+++++b等价于 ( (a++) ++) +b。a++没问题, 但问题就在于a++却不能作为左值, 即不能被赋予值, 因为a++是先返回a的值进行运算, 然后再对a的引用加1。然而a的值 (value-a) 是不能作为左值的。所示 ( (a++) ++) 错误。++a为什么可以作为左值呢?原因在于++a是对a的引用加1, 然后返回a的引用。a的引用当然可以作为左值, 被赋值了。

C语言中的某些符号, 例如:/、*和=, 只有一个字符长, 称为单字符符号。而C语言的其他符号, 例如:+=和==, 以及标识符, 包括了多个字符, 称为多字符符号。当C编译器读入一个字符/后又跟了一个字符*, 那么编译器就必须做出判断:是将其作为两个分别的符号对待, 还是合起来作为一个符号对待。C语言对这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽可能多的字符。也就是说, 编译器将程序分解成符号的方法是, 从左到右一个字符一个字符地读入, 如果该字符可以组成一个符号, 那么再读入下一个字符, 判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能, 继续读入下一个字符。重复上面的判断, 直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理策略就被称为“贪心法”或者“大嘴法”。对这种方法更专业的描述是:“如果 (编译器的) 输入流截止某个字符之前都已经分解为一个个符号, 那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串。”

需要注意的是, 除了字符串与字符常量外, 符号的中间不能有空白, 比如, 空格符、制表符、换行符。

C语言编译器就是用贪心算法对它进行分解的, 按照贪心算法分解a+++++b为: ( (a++) ++) +b, 因为a++的结果为左值, 而左值不能再进行运算, 故a+++++b编译不能通过, 除非写成a+++++b, 在++b前面有个空格, 这时候根据贪心算法分解为: (a++) + (++b) , 这么处理, 编译就可以通过了。

刚接触C语言的人, 往往会被C语言灵活的运算符搞得晕头转向, 特别是处理自增自减运算的时候, 甚至程序为何会得出结果都不理解, 所以, 多分析、多练习是关键。对于自增和自减运算符来说, 主要掌握运算符的特点, 如它的结合性、优先级, 当然对C语言的编译过程中的词法分析也应有一定的了解, 只要把握相关的规则, 不管多复杂的问题也能解决。

C语言自增、自减运算符的应用 篇2

关键词: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 自增、自减运算符在赋值表达式中的应用。

这里的i+++j是理解成i+(++j),还是理解成(i++)+j呢?Turbo C编译处理将自左向右解释为(i++)+j,而不是i+(++j),因此程序运行结果为:k=3, i=2, j=2。

2.2 自增、自减运算符在条件表达式中的应用。

由于程序中的“i>j?++i:++j”是一个条件表达式,虽然自增运算符的优先级比条件运算符的优先级高,但在程序运行时,先对i是否大于j进行判断,由于(i>j)为假,因此只需计算++j, j自增后为4,而对于++i并不计算,i仍为1,程序的运行结果为:k=4, i=1, j=4。

2.3 自增、自减运算符在逻辑表达式中的应用。

程序中的赋值语句“x=++i||++j&&++k;”在执行时,虽然里边包含三个自增运算:++i、++j和++k,而自增运算符的优先级又高于逻辑运算符的优先级,但在Turbo C中实际只执行了++i,对++j和++k并没有执行。这是因为在C语言中针对||运算符和&&运算符在使用的时候有一个规定:在一个复杂的逻辑表达式中,若前面子表达式的值能够决定整个表达式的值,则后面的子表达式不需计算。在表达式x=++i||++j&&++k中,++i的值为1,它与后面的子表达式++j&&++k进行||运算,它能够决定整个表达式的值,后面的++j和++k无需执行,因此程序的运行结果为:x=1, i=1, j=1, k=2。

2.4 自增、自减运算符和其它单目运算符的应用。

程序中对于同一个运算对象i而言,-和++都是单目运算符,优先级相同,那么到底是先运算-i呢,还是先运算i++。由于单目运算符具有从右向左的结合性,所以i先于右边的运算符++结合,即先计算i++,在计算-i,表达式等价于-(i++)。程序运行结果为:2,-1。

2.5 自增、自减运算符在函数中的应用。

在调用函数时,对实参的求值顺序,C标准并无统一规定。在有的系统中,从左至右求值,程序运行结果为:3, 3。但在多数系统(如:Turbo C)中对函数参数的求值顺序是从右向左,上面printf函数中药输出两个表达式的值(i和i++),先求出第二个表达式i++的值3 (i未自增时的值),然后在求解第一个表达式的值,由于在求解第二个表达式后,i自增1, i变为4,所以printf函数中的第一个参数i的值为4,程序运行结果为:4, 3。

为了避免出现类似错误,程序最好改写成:

综上所述,在使用自增、自减运算符时,若在表达式或语句中只包含一种操作时(自增或自减),则前置式和后置式的作用都是一样的,都是使变量加1或减1。若自增、自减运算符和其它运算符联合使用时,就需根据从不同运算符优先级和结合性两点上综合考虑变量的变化方式。若在函数调用中使用自增、自减运算符时,我们要考虑不同的系统中处理方法不尽相同,所以对于初学者而言,若是不能熟练的掌握自增、自减运算符的使用,就需避免写出别人看不懂,也不知道系统会怎样执行的程序,尽量在比较单一的表达式中实现程序。总之,掌握好C语言的运算符、表达式对编写简洁明快、清晰易懂的程序非常重要。

参考文献

[1]谭浩强.C程序设计 (第三版) [M].北京:清华大学出版社, 2005.

[2]杨路明.C语言程序设计[M].北京:北京邮电大学出版社, 2003.

[3]黄维通, 马力妮.C语言程序设计[M].北京:清华大学出版社, 2003.

[4]宗大华, 蒋玮.C语言程序设计[M].人民邮电出版社, 2003.

解析C语言中自增自减运算符 篇3

关键词:C语言,自增自减运算符,优先级,前缀自增 (减) ,后缀自增 (减)

C语言是计算机专业重要的基础课程, 由于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又不知保存到那个内存空间去, 无变量空间可供存放, 所以是非法的表达式。

自增运算符“++”与自减运算符“-”既可以写在变量名的前面, 也可以写在变量名的后面, 分别称为前缀自增 (减) 和后缀自增 (减) 。

1) ++i (前缀自增) 变量i先自增1, 然后再使用i的值

--i (前缀自减) 变量i先自减1, 然后再使用i的值

2) i++ (后缀自增) 先使用变量i的值, 然后i再自增1

i-- (后缀自减) 先使用变量i的值, 然后i再自减1

当自增表达式或自减表达式作为单一的语句出现时, 两者没有区别。

以下以自增表达式为例, 自减表达式的原理类似, 这里就不再累述。

例如, 以下两个例子代码是等价的。

例1:

例2:

但如果自增运算符或自减运算符出现在表达式中, 则两者的运算结果会有所区别。例如:

例3:

例4:

由以上例子知道, 当自增运算符和自减运算符出现在表达式中, 就得特别注意他们所处的位置, 是在变量之前还是在变量之后, 其运算顺序有所不同, 结果也不同。

2 自增 (自减) 运算符与加减运算符间的混合运算规则

自增 (自减) 运算符与加减运算符进行混合运算, 在算术表达式中的情况比较常见的, 但也是比较容易出问题的。例如:

例5:

这个例子中y=-x++表达式, 是将表达式理解为y= (-x) ++, 还是理解为y=- (x++) 呢?要解决这个问题, 就得从运算符的优先级及结合方向来考虑, 自增”++”、取反”-“运算符优先级都是第2级, 结合方向都是从右向左, 按照C语言的规定, 相同优先级运算符的运算先后次序由结合方向来决定, 由于两个运算符都是右结合性, 所以表达式应该理解为y=- (x++) , 从而得出最后结果:x的值为6, y的值为-5。

例6:

要得出x, y的值, 首先要搞清+++运算符的含义。由于C语言编译器在处理自增运算符在算术表达式中的运算规则是:从左至右尽可能多的将若干个字符组成一个有意义的运算符, 如i+++j, 等价于 (i++) +j, 因此y=x+++x+++x表达式C编译器将其处理为y= (x++) + (x++) +x, 而不是y=x+ (++x) + (++x) 。

接下来是计算y= (x++) + (x++) +x表达式的值, 那么, 它们的值到底是多少呢?y=5+6+7=18还是y=5+5+5=15呢?

C语言在计算一个表达式时, 如果表达式含有对于整型变量自增运算符, 则首先执行所有的前缀自增操作, 然后让变量参加算术运算, 得到表达式的结果, 最后再执行后缀增量操作, 最终确定变量的值。因此y= (x++) + (x++) +x表达式的计算过程如下:

1) 由于没有前缀自增量操作, 所以先取x的值5计算表达式的值:y=5+5+5=15。

2) 然后再执行后缀自增量运算, 该表达式中有两个后缀自增量操作, 则执行后x=7。

由此可见, 例6代码执行后x的值为7, y的值15。

例7:

分析:依照例6的分析, y=++x+ (++x) +x++表达式C语言编译器将其处理为y= (++x) + (++x) + (x++) , 整个表达式的计算过程如下:

1) 首先执行前缀自增量操作, 在表达式中有两个前缀自增变量, 经过这两个前缀自增量后, x=7。

2) 然后再取x的值7计算表达式的值:y=7+7+7=21。

3) 最后再执行后缀自增量运算, 该表达式中有一个后缀自增量操作, 则执行后x=8。

因此, 例7代码执行后x=8, y=21。

例8:

分析:依照例6的分析, y=++x+ (++x) + (++x) 表达式C语言编译器将其处理为y= (++x) + (++x) + (++x) , 根据C语言在计算表达式的规则, 整个表达式的计算过程如下:

4) 首先执行前缀自增量操作, 在表达式中有三个前缀自增变量, 经过这三个前缀自增量后, x=8。

5) 然后再取x的值8计算表达式的值:y=8+8+8=24。

6) 最后再执行后缀自增量运算, 由于该表达式中没有后缀自增量操作, 所以x的值还是等于8。

因此, 例8代码执行后x=8, y=24。

从以上三个例子的运算过程及结果知道, 我们在计算自增 (自减) 与加减运算符进行运算时, 除了要考虑运算符的优先级, 还要看清白增 (自减) 是前缀运算还是后缀运算, 这样才能正确得出答案。

3 自增 (自减) 运算符在函数中作为实参表达式的运算规则

当自增 (自减) 表达式放在函数里作为实参表达式时, 它的计算方法与作为普通语句的运算结果是完全不同的。由于C语言的函数执行过程是将函数实参表达式的值按照从右至左顺序入栈, 入栈前就将实参表达式的值计算完毕, 被调函数从栈中取参数值使用, 因此如果函数有多个参数, 它们是按照从右至左的顺序计算。以自增表达式作printf函数的参数为例:

例9:

此程序的运算结果是输出6, 5;而不是6, 6的结果。这是因为++x, x作为printf () 的两个参数时, 是按照从右向左顺序计算的, 先输出x为5, 再计算++x的值为6。

例10:

该程序与例6不同的是把自增表达式x+++x+++x放到了prinf函数的参数位置, 除此之外没有任何的变化, 但结果却是不一样的, 表达式的结果从原来的15变成了18, 这说明一般语句中的自增运算规则与函数中的自增运算规则不相同。在实现函数调用时, Turbo C系统规定如果实参中存在自增表达式, 则按照“自左至右”的运算规则来计算表达式的值。表达式x+++x+++x, C语言编译器将其处理为 (x++) + (x++) +x, 第1个x++的值为5, 第2个x++的值为6, 第3个x的值为7, 故5+6+7=18。

4 结束语

自增 (自减) 运算符在使用时应注意区分是变量的值还是表达式的值, 是前缀自增 (减) 量还是后缀自增 (减) 量, 以及它们在不同的表达式中的运算规则。在计算自增 (减) 表达式时, 除了了解表达式的类型、掌握运算规则外, 还要清楚自增 (减) 表达式所处的位置, 更要清楚自增 (减) 运算符的运算过程。当自增 (减) 运算符出现在算术表达式中, 则要注意它的运算规则:先执行所有的前缀自增操作, 然后让变量参加算术运算, 得到表达式的结果, 最后再执行后缀增量操作, 最终确定变量的值;当自增 (减) 运算符出现在函数参数中时, 有多个参数时, 参数是按照从右至左的顺序计算, 参数中的自增 (减) 表达式运算是按照自左至右的顺序计算的。

对于初学者使用自增 (减) 运算符, 要熟练掌握它们的这些规则, 避免写出一些不符合运算规则的表达式。所以熟练掌握好C语言的运算符, 表达式对写出清晰易读的好程序是非常重要的。

参考文献

[1]谭浩强.C程序设计[M].2版.北京:清华大学出版社, 2001.

【变量自增/自减】推荐阅读:

文化变量07-04

中介变量08-06

变量施肥08-06

变量关系08-07

变量分析09-07

模糊变量09-10

变量分布09-14

工艺变量09-25

变量作业09-28

离散变量10-06

上一篇:广东家具下一篇:中职英语语法游戏教学