C语言程序自增自减问题的几点思考

合集下载

C语言中指针自增自减运算常见错误分析

C语言中指针自增自减运算常见错误分析

C语言中指针自增自减运算常见错误分析
田祖伟;孙光;杨素萍
【期刊名称】《现代远距离教育》
【年(卷),期】2008(000)006
【摘要】C语言是一种通用的结构化程序设计语言,具有层次清晰、表达式简洁、运算符和数据类型丰富等特点,便于实现各类复杂的数据结构,并且还可以直接访问内存的物理地址,支持位操作.在C语言中,指针的使用非常广泛,使用指针通常可以生成更为高效、更紧凑的代码.本文根据作者多年的C语言教学和软件开发经验,通过具体的实例分析了C语言中指针自增自减运算在编程过程中容易出现的一些常见错误,对于帮助学生正确地使用指针具有较高的参考价值.
【总页数】2页(P77-78)
【作者】田祖伟;孙光;杨素萍
【作者单位】湖南第一师范学院,湖南,长沙,410205;湖南财经高等专科学校,湖南,长沙,410025;湖南第一师范学院,湖南,长沙,410205
【正文语种】中文
【中图分类】TP31
【相关文献】
1.C语言中自增自减运算符的应用与解析
2.C语言中自增自减运算符在表达式和函数中的应用
3.试析C语言中的自增自减运算符
4.C语言中多个自增自减的运算规律
5.浅析C语言中的自增自减运算
因版权原因,仅展示原文概要,查看原文内容请购买。

浅谈C语言中自增自减运算符的应用

浅谈C语言中自增自减运算符的应用

Computer Knowledge and Technology 电脑知识与技术本栏目责任编辑:谢媛媛软件设计开发第6卷第17期(2010年6月)浅谈C 语言中自增自减运算符的应用周亮(九江学院信息科学与技术学院,江西九江332005)摘要:C 语言的运算符,操作灵活,其中自增自减运算符的功能较为特别。

合理的使用自增自减运算符可以提高程序执行的效率,但同时也是最难理解和容易出错的运算符,该文就自增自减运算符在C 语言灵活应用的几个方面做一点探讨。

关键词:C 语言;自增运算符;自减运算符中图分类号:TP312文献标识码:A 文章编号:1009-3044(2010)17-4714-02Discussion on the Application of Auto-increment Auto-decrement Operator in C Programming LanguageZHOU Liang(Information Technology Department,Jiujiang University,Jiujiang 332005,China)Abstract:The operation of C programming language operator is flexible.Meanwhile,the function of Auto-increment auto-decrement operator is very special.The reasonable use of Auto-increment auto-decrement operator can improve the efficiency of the program imple -menting but this kind of operator is also the most difficult to understand and the easiest one to err.This thesis mainly discusses several as -pects on the flexible application of Auto-increment auto-decrement operator.Key words:C programming language;Auto-increment operator;auto-decrement operatorC 语言具有丰富的运算符,灵活使用这些运算符可以提高程序的运行效率。

C语言中自增自减运算符教学探究-8页精选文档

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语言程序自增自减问题的几点思考

值 变 为 6; 后 进 行 6 +6的 运 算 , 得 l 。 然 +6 故 8
(I) 表 达 式m=( II . ++i +( ) i +( ) ++) ++i的值 。
系 统 先 对 表 达 式 扫 描 , 到 两 次 ++i 一 次 遇 和
i ++, 对 i 行 两 次 增 1 i 值 变 为 5; 后 先 进 ,的 然
分 别 在 VC和 TC中 的 运 行 结 果 为 例 来 说 明 。
# i c ud ” t o. n l e s di h”
v i m i( o an ) d
{ t i ,=3 m , m=i ++i ++i i =3j , nI n + + ++; n =++ +( j+( j ; j ++ ) ++ )

理 论探 索 ・
C 语言程序 自增 自减 问题 的几点思考
郑 英 ( 内江 职 业技 术 学院 四1 内江 6 1 o ) 1 I 4 1 o
摘 要 : 章 针 对 教 学 和 各 类 考 试 中 所 遇 到 的 c语 言 自增 . 问 题 , 运 算 顺 序 、 出 方 式 , 译 器 对 自增 减 问 题 的 影 响 出 发 , 过 大 量 试 文 减 从 输 蝙 通 验 进行 分 析 、 证 问题 源 头 , 出学 生 在 学 习和 考 试 中对 白增 , 问题 的认 识 态 度 。 论 提 减 关 键 词 : i - ++ 一一 赋 值 混合 运 算 c ̄* 中 图分 类 号 : 4 4 G6 2. 文献标识码 : A 文章 编 号 : 0 —94 ( 1 ) —0 1 —0 1 1 2 1 07 6 0 0 0 1 9 1
nf t 函数 是 要 输 出 两 个 表达 式 的值 (和 i i ++

C语言自增自减运算符应用探讨

C语言自增自减运算符应用探讨

摘要:从C语言自增自减运算符的概念出发,分析了C语言中自增自减运算符在循环结构和指针运算中的应用方法,并针对自增自减运算符在程序设计过程中容易出现错误的方面作了精辟地阐述。

关键词:运算符表达式循环结构指针数组在众多的计算机程序设计语言中,C语言以其灵活性和实用性受到广大计算机应用人员的喜爱,并且也成为许多高校工科各专业学习程序设计的必修课程之一。

在C语言的教学过程中,自增自减运算符概念抽象,运用灵活,是学习C语言的难点之一。

下面就其灵活应用的几个方面作进一步探讨。

C语言程序设计过程中,我们经常用到x=x+1、x=x1这样的赋值表达式,用更简洁的方式表示:x=x+1可表示为:x++或++xx=x-1可表示为:x--或--x“++”、“--”称为自增、自减运算符。

它们是单目运算符,只能应用于变量,而不能用于常量或表达式。

结合性与简单赋值运算符相同,但优先级高于任何双目运算符。

自增自减运算符有两种使用形式:前缀形式,即它们在操作数前,如++x、--x;后缀形式,即它们在操作数后,如x++、x--。

++表达式与--表达式独立使用时,前缀形式与后缀形式无区别,但它们在表达式中被引用时,结果是不同的。

前缀形式是先增(减)1,后被引用;后缀形式是先被引用,后增(减)1。

例如,如果变量x的原值等于3,则执行下面的赋值语句:①y=++x;(x的值先变成4,再将x的值赋给y,y的值为4)②y=x++;(先将x的值3赋给y,y的值为3,然后x的值变为4)为了充分发挥计算机在程序控制下进行自动计算的功能和运算速度快的特点,在程序设计过程中力求把复杂问题的求解转化为简单过程的重复。

为此,在多数计算机程序设计语言中,都提供有循环结构。

C语言提供有3种循环结构:for结构、while结构和do…while结构。

在while结构和do…while结构中,其循环体中应有使循环趋向于结束的语句。

而这样的语句一般用赋值语句。

例如用表达式“i++”或“i--”。

如何正确理解C语言中自加或自减运算的结果

如何正确理解C语言中自加或自减运算的结果

如何正确理解C语言中自加或自减运算的结果
贾学斌
【期刊名称】《武汉职业技术学院学报》
【年(卷),期】2003(002)002
【摘要】本文对C语言中自加或自减运算中出现的若干容易引起误解的方面作了一些有益的尝试和探讨.
【总页数】2页(P60-61)
【作者】贾学斌
【作者单位】武汉职业技术学院,计算机系,湖北,武汉,430074
【正文语种】中文
【中图分类】TP312
【相关文献】
1.浅谈C语言中的自加与自减运算符的应用 [J], 吴艳
2.试析C语言表达式中自加、自减运算 [J], 冯治广
3.在DEV C++环境下C语言自加自减运算符使用分析 [J], 袁玲
4.C语言中自加运算和自减运算的剖析 [J], 王荣
5.C语言中的自加自减运算 [J], 秦玉平;戴心来
因版权原因,仅展示原文概要,查看原文内容请购买。

c语言自增与自减运算符详解

c语言自增与自减运算符详解

c语言自增与自减运算符详解C语言中的自增和自减运算符是一种特殊的运算符,可以用来对变量进行增加或减少操作。

它们不仅可以用于数值类型的变量,还可以用于指针类型的变量。

在本文中,我们将详细介绍自增和自减运算符的使用方法和注意事项。

让我们来了解一下自增运算符(++)的用法。

自增运算符可以将变量的值增加1。

它可以用在变量前面或后面,分别表示先增加再使用和先使用再增加。

当自增运算符用在变量前面时,它会先将变量的值增加1,然后再使用增加后的值。

例如:```cint a = 1;int b = ++a;// 此时a的值为2,b的值为2```当自增运算符用在变量后面时,它会先使用变量的值,然后再将变量的值增加1。

例如:```cint a = 1;int b = a++;// 此时a的值为2,b的值为1```自增运算符也可以用于指针类型的变量。

当自增运算符用在指针变量前面时,它会将指针的值增加指针指向的数据类型的大小。

例如:```cint arr[5] = {1, 2, 3, 4, 5};int *p = arr;p++; // p指向arr[1]```当自增运算符用在指针变量后面时,它会先使用指针的值,然后再将指针的值增加指针指向的数据类型的大小。

例如:```cint arr[5] = {1, 2, 3, 4, 5};int *p = arr;int a = *p++; // a的值为1,p指向arr[1]```接下来,让我们来了解一下自减运算符(--)的用法。

自减运算符可以将变量的值减少1。

它的使用方法和自增运算符类似,可以用在变量的前面或后面。

当自减运算符用在变量前面时,它会先将变量的值减少1,然后再使用减少后的值。

例如:```cint a = 2;int b = --a;// 此时a的值为1,b的值为1```当自减运算符用在变量后面时,它会先使用变量的值,然后再将变量的值减少1。

例如:```cint a = 2;int b = a--;// 此时a的值为1,b的值为2```自减运算符也可以用于指针类型的变量。

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

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。

好程序员大数据培训 自加自减运算规则下的思考

好程序员大数据培训 自加自减运算规则下的思考

好程序员大数据培训自加自减运算规则下的思考来到千峰好程序员一个半月,收获颇丰。

这一路上走走停停,顺着少年脱发的痕迹,认识到自己的成长!这两天做SSM框架整合,因刚开始接触这部分知识,配置xml文件,导出各种库,操作有些繁杂,所以有点摸不到头绪。

好在随着第一个轮增删改查功能的实现,意外发现这个框架其实简化了很多代码。

从前200行代码的不解,到中间几百行的信手拈来,真的是实现了灵魂的洗涤,质的飞升!近期学习了自加自减,那么接下来便和大家分享下这部分知识。

一、关于自加自减引起的运算规则思考1.代码public classMain {public static void main(String[] args) { byte a =4; byte b =6; byte c = a + b;}}以上代码在编译过程中就会报错。

2.分析:为什么byte a = 4;就不会报错?因为byte是一个字节,八个二进制位,此时其范围为-128 ~ +127,所以4在其范围内,所以可以被赋值。

一旦这个数值超过了127,那么编译就会报错了。

为什么byte c = a + b;就报错呢?这是java的机制导致的,java在对byte这种类型进行“运算”时,会将其转换为int类型,两个int类型相加,赋值给byte 类型肯定会报错的。

为什么byte = 3 + 4;又不会报错呢?跟第一个一样3+4是常量的计算,会优先执行,执行结果再赋值给byte,此时判断数值是否满足该类型范围,满足就直接赋值了。

3.总结。

两个变量相加,先对类型进行提升,然后运算,再将运算结果赋值。

两个常量相加,先计算常量数值,然后判断是否满足类型范围,再赋值。

再加一例:在Java中,两个byte类型数据相加为什么会报错呢?byte b=4;byte b1=3;byteb2=7;b=b1+b2; //计算b,错误b=b1+7; //计算bbyte b=3+7; //计算。

c语言指针自增自减运算的含义

c语言指针自增自减运算的含义

c语言指针自增自减运算的含义C语言中的指针自增自减运算在编程中具有非常重要的含义和作用。

通过对指针的自增自减操作,我们可以更加灵活地操作内存位置区域,实现对数据的高效访问和操作。

本文将深入探讨C语言中指针自增自减运算的含义和用法,帮助读者全面理解这一重要的概念。

一、指针的基本概念在C语言中,指针是一种非常重要的数据类型,它用来存储变量的位置区域。

通过指针,我们可以直接访问或修改变量的值,实现对内存的精准控制。

指针的自增自减运算就是针对指针变量所指向的内存位置区域进行操作,使得指针能够指向相邻的内存单元,实现对数据的高效遍历和处理。

二、指针的自增运算指针的自增运算使用”++“符号来实现,它的含义是使指针指向下一个内存单元。

如果有一个指针变量ptr,执行ptr++操作后,ptr将指向下一个内存位置区域,即ptr += sizeof(数据类型)。

这种操作在对数组进行遍历或者实现循环遍历过程中非常有用,可以快速地访问数组中的元素。

在实际编程中,指针的自增运算可以用于实现对数组的遍历、链表的操作和内存空间的动态分配等。

通过合理地使用指针的自增运算,我们可以优化程序的性能,提高数据的访问效率。

三、指针的自减运算指针的自减运算使用”--“符号来实现,它的含义是使指针指向上一个内存单元。

类似地,执行ptr--操作后,ptr将指向上一个内存位置区域,即ptr -= sizeof(数据类型)。

指针的自减运算可以用于倒序遍历数组或链表等数据结构,也可以配合动态分配的内存空间进行内存释放和管理。

在实际编程中,指针的自减运算同样具有重要的作用,它可以帮助我们在处理一些特定问题时更加灵活地操作内存位置区域,实现复杂数据结构的遍历和管理。

四、个人观点和总结作为一名程序员,深入理解指针的自增自减运算对于提高编程能力和理解计算机底层原理非常重要。

通过合理地使用指针的自增自减运算,我们可以更加高效地处理内存数据,实现对各种数据结构的操作,为程序的性能优化和功能实现提供了重要的支持。

C语言中的自增和自减语句分析

C语言中的自增和自减语句分析

ቤተ መጻሕፍቲ ባይዱ
Vol. 21 No. 3 May 2002
C 语言中的自增和自减语句分析
唐金文
(曲靖师范学院 计算机科学系 ,云南 曲靖 655000)
摘 要 :在 C 语言中 ,运算符和表达式使用灵活 ,利用这一点可以巧妙地处理许多在其他语言中难以处 理的问题. 但另一方面 ,有时会出现令人搞混的问题. C 语言中的自增语句和自减语句就如此 ,然而 ,在 C 语 言的许多教材和参考书中 ,作者对 C 语言中的自增语句和自减语句并没有作详细的分析和说明 ,并且不同 的教材或参考书对自增语句和自减语句的叙述不尽相同 ,从而导致在教学活动中 ,教师难讲 ,学生难以领会 和掌握其应用. 据此 ,结合教学对 C 语言自增语句和自减语句的功能及使用规则作一些探讨就很有必要.
关键词 :C 语言 ;自增语句 ;自减语句 中图分类号 :TP 文献标识码 :A 文章编号 :1009 - 8879 (2002) 03 - 0096 - 02
1 自增 、自减运算符及作用 C 语言 ①中 ,自增运算符为“ + + ”,其作用是
使变量的值增 1. 自减运算符为“ - - ”其作用是 使变量的值减 1. 2 自增 、自减运算符的形式
} 若运算规则是“自左而右”的 ,那么该程序执行完 x = a + + + a + + + a + + ;语句后 , = 5 + 6 + 7 = 18 ;若运算规则是“自右而左”的 ,则执行完该句 后 ,x = 8 + 7 + 6 = 18 ;而程序的运行结果是 15 ;同 理 ,程序执行完 x = + + a 3 + + a 3 + + a ;后 ,若 运算规则是“自左而右”的 ,则结果应该是 x = 6 3 7 3 8 = 336 ,若运算规则是“自右而左”的 ,则执行 完该句后 ,x = 8 3 7 3 6 = 336 ;而运行结果是 512 ;

c语言自增自减问题总结

c语言自增自减问题总结

C语言自增自減问题总结在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。

C 语言为这种操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。

它们是单目运算符,是从右向左结合的算术运算符。

学习和应用这两个运算符时应注意以下几点:我将自增自减运算符和变量结合在一下的表达式称为自增自减表达式,如x++,--I等。

通常情况下就有以下的结论:1‘’前缀表达式:++x, --x; 其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即“先变后用”,也就是变量的值先变,再用变量的值参与运算。

2、后缀表达式:x++, x--; 先用x的当前值作为表达式的值,再进行自增自减1运算。

即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化,。

如a=8; b=a++; c=++a; 其中赋给变量b的值为表达式(a++)的值,不应该理解为a的值,则b=8, c=10;3、自增、自减运算只能用于单个变量,只要是标准类型的变量,不管是整型、实型,还是字符型变量等,但不能用于表达式或常量。

如:++(a+b), 与5++,const int N=0; N++; 等都是错误的。

而i+++j++、++i+(++j)、++a+b++、++array [--j];等,这些都是合法的。

4、再说结合性与结合方向编译器对程序编译时,从左到右尽可能多地将字符组合成一个运算符或标识符,因此i+++j++等效于(i++)+(j++),两个“++”作用的对象都是变量,这是合法的;而++i+++j等效于++(i++)+j,第1个“++”作用的对象是表达式“i++”,这是不允许的。

自增自减运算符是单目运算符,其结合性是从右到左。

表达式k=-i++等效于k=(-i)++还是k=-(i++)?。

因为负号也是单目运算符,因此,上式从右到左结合,等效于k=-(i++);若i=5,则表达式k=-i++运算之后k的值为-5,i的值为6。

C语言自增(自减)运算符运算规律的探讨

C语言自增(自减)运算符运算规律的探讨

它的作用是 自增( 自减) 运算符是一元运算符, 使变量的值增 1 ( 或者减 1 ) 。 运算符出现在变量的 前面称为前缀运算符, 运算符出现在变量的后面称 为后缀运算符。前缀自增运算符在程序执行过程中 “先自增后运算 ” 遵循 的规则, 后缀自增运算符遵循 “先运算后自增 ” 的规则。 同理, 自减运算符也是一 样。例如: 1 : main( ) 实验 1-
第 27 卷 第 5 期 2016 年 9 月 1730 ( 2016 ) 05000804 文章编号: 1674-
陇东学院学报
Journal of Longdong University
Vol. 27 No. 5
Sep. 2016
C 语言自增 ( 自减 ) 运算符运算规律的探讨
唐 婷, 吕浩音
( 陇东学院 信息工程学院, 甘肃 庆阳 745000 )
目前 C 程序设计语言最为常用的编译器 分别为 Microsoft 公司推出的以 C + + 语言为 Bor基础的 Visual C + + 6. 0 ( 以下简称 VC ) , land 公 司 推 出 的 Turbo C 系 列 ( 以 下 简 称 TC ) 。 而在高校的教学中往往只偏向于其中 的一种 , 众多的 C 语言教程也是选择一种编 译环境为基础 , 对自增 ( 自减 ) 运算符的应用 举例是建立在相应的编辑环境之上 , 以( i + + ) + ( i + + ) + ( i + + ) 为例 , 杨路明主编的 《 C 语言程序设计教程 》 中, 它的值为 9 , 因为 它是按照 TC 编译器的执行结果编写的 ; 谭浩 《 C 语言程序设计 》 , 强主编的 虽然对各种常 见的编译器进行了简单介绍 , 也提到了在某 个系 统 中 , 运 行 结 果 为 12 , 但并没有指出是 哪种编译器 。 当 自 增 ( 自 减 ) 运 算 符 与 其 它 运算符连用时 , 运算顺序与优先级有很大关 , 《 C 语言参考手册 》 系 认为自增 ( 自减 ) 运算 符的优先级高于算术加 、 减法运算符 , 并且后 缀自增 ( 自减 ) 运 算 符 高 于 前 缀 自 增 ( 自 减 ) 运算符 , 但 H. M. Deitel 所 著 的《C 程 序 设 计 教程 》 则认为自增 ( 自减 ) 运算符的优先级和 [14 ] 。 从以 算术加 、 减法运算符的优先级一样 上教程 中 读 者 是 无 法 理 解 哪 个 结 果 是 正 确 的, 所以 , 本文重点通过两个编译环境 , 对一 ( ) , 些典型的自增 自减 运算符的用法 做了详 细的比较和分析 。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言程序自增自减问题的几点思考
作者:郑英
来源:《数字技术与应用》2010年第10期
摘要:文章针对教学和各类考试中所遇到的C语言自增、减问题,从运算顺序、输出方式、编译器对自增减问题的影响出发,通过大量试验进行分析、论证问题源头,提出学生在学习和考试中对自增、减问题的认识态度。

关键词:C语言++--赋值混合运算
中图分类号:G642.4 文献标识码:A 文章编号:1007-9416(2010)10-0119-01
1 引言
自增、减一直是c语言中一个重要问题,也是大家讨论的热点。

通常在c语言等考及相关的竞赛中,自增、减的嵌套使用,变量前后置自增、减,同一变量不同形式的自增、减四则运算等试题层出不穷,如:在进行ITAT C语言程序设计大赛的培训中,类似于int
i=3;m=i+++i+++i++;求m的值的题目特别多。

笔者在教学和各种考试中发现部分题目运算结果存在差异,针对疑问,对学习和考试中所遇到的自增、减问题进行大量分析与实验论证,总结了几点关于自增、减问题的思考。

2 基本知识
通常所说的自增、减是指操作数在自身的基础上增加1或者减少1,分为前后置两中情形。

前置操作是指操作数先执行增1或减1运算,再参加其他操作;后置操作则是指操作数的值先进行其他操作,再对自身做增1、减1运算。

一般应用在以下几种情况:
(I).计数。

常用于修改控制循环的变量,n++书写和阅读比n=n+1简便,生成的目标代码更短。

(II).指针。

操作对象是指针类型时,按照指针所指向的存储单元增1、减1操作。

需要注意的是,增1、减1运算的操作对象只能是变量,因为增1、减1操作是将操作对象的值加1或者减1后送回存储单元,而常量、表达式等则无对应的存储单元。

例如:++x和y++是合法的,++10、(i+j)++、(-i)++和(i++)++则是非法的。

3 问题分析及实例论证
3.1 自增、减及前、后置运算顺序导致的结果差异
自增减运算何时运算?何时引用呢?下面以TC环境下程序的分析:
#include”stdio.h”
void main()
{ int i=3,m; m=(i++)+(i++)+(i++); printf(“i=%d,m=%d”,i,m);i=3; m=(++i)+(++i)+(++i);
printf(“i=%d,m=%d”,i,m);i=3; m=(++i)+(i++)+(++i); printf(“i=%d,m=%d”,i,m);}
运行结果为:i=6,m=9 i=6,m=18i=6,m=15。

分析情况如下:(I).表达式m=(i++)+
(i++)+(i++)的值。

也许有人会认为它相当于3+4+5,即12。

事实上,用Trbo C系统时它等
于9。

它是先把表达式i的原值(3)取出来参加表达式的运算,因此先进行三个i相加得9;
然后再使变量i进行三次增1,故i的值变成6。

(II).表达式m=(++i)+(++i)+(++i)的值。

也许有人会认为它相当于4+5+6,即15。

事实上它的值是18。

理由是:++i的自增1是在整个表达式计算之前进行的,即对表达式扫描,先对i进行三次增1,i的值变为6;然后进行6+6+6
的运算,故得18。

(III).表达式m=(++i)+(i++)+(++i)的值。

系统先对表达式扫描,遇到两次++i和一次i++,先对i进行两次增1,i的值变为5;然后进行5+5+5的运算,故得15;运算
完后再使变量i增1(因为i++是先引用后增1)。

3.2 输出方式不同导致的结果差异
赋值输出与表达式直接输出的结果会不会有差异?这些差异又是怎样形成的呢?实验证明,Turbo系列编译器对i+++i+++i++类型的表达式,根据是否将其赋值给某个变量,会有不
同的解释方式,以下面这段程序为例进行分析:
#include”stdio.h”
void main()
{int i,m;i=3;m=(++i)+(i++)+(++i); printf(“m=%d”,m); i=3;printf(“%d”, (++i)+(i++)+(++i));}
(1)Turbo C 环境下,含有增量(减量)的表达式作为函数的参数时与用于赋值时求值顺
序是不同的。

例如,上面的程序中m的值为15,而语句: printf(“%d”,(++i)+(i++)+(++i)); 输出结果为14。

这是因为:对函数参数求值时并不是先扫描后求值,它首先求第一个++i的值为
4,再求第二个i++的值为4(因为第一个++i的值为4),再求第三个++i的值为6(因为第二
个i++之后i的值已变为5),最后将它们的和4+4+6等于14输出。

(2)C语言中类似上述问题还有一些。

例如,i的初值为3,如果有下面的函数调用:Printf(“%d,%d”,i,++i);在有些系统中,对函数的参数是从左至右求值,输出“3,3”。

在多数系统中,对函数参数的求值顺序是自右至左(Turbo C就是如此)。

上面的Printf函数是要输出
两个表达式的值(i和i++分别是两个表达式),先计算出i++的值再计算i的值,i++的值为3,计算i++后i的值变为4,这个4就成了第一个参数i的值,因此上面函数输出的结果是“4,3”。

3.3 编译器不同导致结果差异
同一段程序在不同的编译器中经过编译得出不同的结果。

下面就以同一段程序分别在VC 和TC中的运行结果为例来说明。

#include”stdio.h”
void main()
{int i=3,j=3,m,n;m=i+++i+++i++;n=++j+(++j)+(++j);
printf(“m=%d”,m);priintf(“n=%d\n”,n);}
在TC中运行得到的结果是:m=9n=18;在VC中运行得到的结果是:m=9n=16,分析见上。

由以上程序可知,在不同编译系统中,编译器对表达式的解释方式是不同的,所以在分析结果的时候,明确程序的编译环境很重要。

至于解释方式不同的原理,这是软件自身设计问题,在此不再深究,有兴趣的读者可查阅相关资料。

4 结语
由此可见:程序的自增、减问题与运算顺序、输出方式、编译器等都存在密切的关系。

笔者认为:读者不必死记,对可能出现问题的地方,必要时上机调试,以免只知其然而不知其所以然;自增、减与各种表达式及变量的混合使用时,为了保证程序的可读性,应该尽量避免使用容易引起歧义的表达式;虽然++和--的使用,看起来简洁,但也会出现一些意想不到的情况,初学者慎用;同时,也建议在各种考试和竞赛中,出题者也少使用一些容易引起歧义的试题。

参考文献
[1] 杨旭.C语言程序设计[M].北京:人民邮电出版社,2005.
[2] 罗幼平.C语言程序设计[M].北京:北京科学出版社,2004.
[3] 李智渊.C语言[M].成都:电子科技大学出版社,1991.。

相关文档
最新文档