【摘 要】C语言中运算符十分丰富,自加运算和自减运算是c语言的教学中的重点和难点,但我们只要在教学中抓住运算的基本定义,通过经典题型分析和适度深入解析,就不难达到熟练应用之目的。

【关键词】运算的定义;经典题型;深度解析

C语言作为一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特征,编程功能十分强大。C语言定义了丰富的运算,多达40余种,这给c语言的学习带来了一定的困难。++运算(自加运算)和--运算(自减运算)正是这些运算中极具特点而又非常重要的两种运算,在教学中,历来是教学的难点,而关于这方面的系统的讲解资料又很难找到,本人在c语言教学中,对++和--运算就教学中碰到的问题,做了一些探索性的研究,现归纳总结,以期与同行共勉。

一、运算的定义

1. ++(自加运算)的定义

++(自加运算)是单目运算,且只能以变量为运算对象,如i++,++a等(i,a为已定义变量),它等效于i=i+1(a=a+1),但是,自加运算又有自己的特点――与其它运算的相关性,虽然对变量i来讲,i++与++i没有什么区别,但当i++和++i还参与其它运算时,i++和++i对整个运算结果的影响是不同的,例如有如下程序段:

int i=1 ,s ;

s=(i++)+1;

printf(“i=%d;s=%d\n”,i,s);

其运行结果是:i=2;s=2

若将程序中s=(i++)+1;换为s=(++i)+1;其它不变,其运行结果就会变为:i=2;s=3 ,此处我们可以看到: i++与++i的不同,并不影响i本身的结果,但却对s的值产生了不同的影响,这是因为系统在处理++i时先对i进行了加1运算,即:i=i+1,然后才参与其它运算,而在执行i++时,现将i的值参与其它运算,然后才给自己加1,所以得到的s的值是不同的,这正是++(自加运算)与众不同的地方。

2. --(自减运算)的定义

与自加运算类似,--(自减运算)也是单目运算,且只能以变量为运算对象,若i为已定义变量,i的自减运算分为--i和i-- ,两者对i自身的作用是一样的,即i=i-1 ,但当它们还参与其它运算时,--i先执行自减1运算,然后以i的值参与其它运算,i--则先以i值参与其它运算,然后对i进行自减1运算。

二、经典题型

下列程序执行后输出结果是什么?

main()

{int a=100;

printf(“a++=%d;”,a++); */①/*

printf(“++a=%d;”,++a); */②/*

printf(“a--=%d;”,a--); */③/*

}

当程序执行到①时,输出表达式a++,由于自加符++后置,故先输出a的值100,然后a自加1,即执行完①后输出“a++=100”,a的值是101。

当程序执行到②时,输出表达式++a,由于自加符++前置,故a先自加1变为102,然后输出a的值102,即执行完②后输出“++a=102”,a的值是102。

当程序执行到③时,输出表达式a--,由于自加符--后置,故先输出a的值102,然后a自减1,即执行完③后输出“a--=102”,a的值是101。

综上所述,程序输出结果为:

a++=100;++a=102;a--=102

小结:该题目只要深刻领会++(--)运算在运算符前置和后置时,对其参与的其它运算(操作)的处理时机是不同的,前置时先进行自加1(自减1)运算,再进行其它运算(操作),后置时先参与其它运算(操作),再进行自加1(自减1)运算。

三、深度解析

1. 分析下列程序执行后的输出结果

#include

main( ){

int i =1,j=2, p=0,q=0 ;

printf(“%d,%d,%d,%d”, p+i , j++ , q+j ,-- i ); */⑤/*

}

很多同学分析:在程序执行到⑤时 p+i输出1(0+1=1) ;j++输出2(j=2),j=2+1=3 ;q+j输出3(0+3=3);--i输出0(1-1=0) 。得到的结果是:1 ,2 ,3 ,0 。然而上机运行的结果却是:0 ,2 ,2 ,0 ,这是为什么呢?原来,turboC在printf()函数中,处理表达式列表的顺序是从右到左进行的,如果在表达式列表中不包含自加(自减)运算,从哪边开始处理数据都不会影响运算结果,但是,如果表达式列表中包含了自加(自减)运算,这个“处理数据的顺序”就会影响到数据的运算结果。正确的做法是先处理―i,输出0(1-1=0);其次是q+j,输出2(0+2=2);再次是j++,输出2(j=2,执行j++后j=3);最后是p+i,输出0(0+0=0),处理完毕后按原来顺序输出结果:0,2,2,0 。

结论:turboC在printf(“字符串”,表达式列表)函数中,处理表达式列表的顺序是从右到左进行的,如果在表达式列表中包含自加(自减)运算,运算起来就要十分细心。

2.分析如下程序输出结果:

#include

main( ){

int i=5,j=5,p,q;

p=(i--)+( ++ i)+(i++); */ ⑥/*

q=(++j)+( j++); */ ⑦/*

printf(“%d,%d,%d,%d”,p,q,i,j);

}

严格的讲,程序中⑥、⑦中的表达式是不符合C语言语法规范的。尽管如此,但在实际当中,我们仍会经常碰到类似的题目,而且这些题目在机器上运行也会有特定的结果,因此在这里我仍然想探讨一下其解法。

笔者经过反复推敲,找到了一种解决这类问题的办法,并在实际应用中与机器执行的结果符合的很好。

我的思路是:将⑥或⑦中右侧表达式的运算分为3类:前置(自加或自减)运算、后置(自加或自减)运算和加(减)法运算,首先要进行的是前置运算,其次执行加(减)法运算,最后执行后置运算。如(i--)+( ++ i)+(i++),其中中间的自加运算为前置运算,其前后的自减运算和自加运算都是后置运算,首先进行前置运算,即++i,执行后i=5+1=6;然后执行加法运算,即3个i相加;结果为6+6+6=18,最后执行后置运算,即i=6+1-1=6 。所以题目中p=18,i=6。同理(++j)+( j++)中++j为前置运算,j++为后置运算,先进行前置运算j=5+1=6;然后执行加法运算,即2个j相加6+6=12;最后进行后置运算j=6+1=7 。所以题目中q=12,j=7,程序最后运行结果为:18,12,6,7 。以上方法可扩展到任何含有自加(自减)运算的运算表达式中。

四、结论

当一个表达式中含有多个自加(自减)运算时,可将运算分为前置运算、后置运算和其它运算,按照先执行前置运算,然后执行其它运算,最后执行后置运算的法则,可得到正确的运算结果。

对C语言的教学而言,能让学生理解到以上的深度,我认为教学的任务就完成了,至于更深层次的研究就是他们以后的事了,希望本文能给广大C语言教学工作者带来便利!

参考文献:

[1] Dennis M. Ritchie等. The C programming Language [M].U.S:Prentice Hall,1988

[2]周查金等. C语言程序设计.北京:高等教育出版社,2000.5

c语言中字符减减自符意思,C语言中的自加自减运算相关推荐

  1. c语言中字符怎么表示6,6、C语言中的字符串

    一.C语言中的字符串 字符串是一种重要的数据类型,但是C语言并没有显示的字符串数据类型,不像java有String ,OBC有NSString等等.所以C语言中的字符串一般以字符串常量的形式出现或者存 ...

  2. c语言统计字符数组上字母和数字,C语言问题求数组中的字母数字字符个数 – 手机爱问...

    编个程序要求满足以下功能将字符串数组中每一行中的大写字母A.B.C都换成数字2,并且去除字符串中的连字符号'-',但是数字保持不变.设字符串数组有3行.例如:字符串内容为:输出的内容为A-BC-CBC ...

  3. c语言检查字符数组不为空,【C语言】检查输入是否为空,如为空,程序退出

    检查用户输入是否为空行,如果输入为空,程序将退出:如不为空,屏幕打印输入的字符串. #include char input[257], *ptr; int main(void) { puts(&quo ...

  4. c 语言输出字符用什么作用是什么,C语言中输出字符串用什么符号

    C语言中输出字符串用双引号. (推荐教程:c语言教程) 详细解读: 在C语言中,有两个函数可以在控制台(显示器)上输出字符串,它们分别是: puts():输出字符串并自动换行,该函数只能输出字符串. ...

  5. C语言中字符数据超过127,如何用C语言显示ascii码超过127的字符

    C语言的程序代码如下: #include "stdio.h" main() {inti; for (i=1;i<256;i++) { printf("%c &quo ...

  6. c语言计算器实现简单的四则运算.(加,减,乘,除)实验报告,C语言数据结构“简单计算器。”1、简单计算器。请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程...

    共回答了23个问题采纳率:82.6% #include #define MaxSize 99 void trans(char str[],char exp[]) /*将算术表达式转换成后追表达式*/ ...

  7. 计算机c语言基础字符,2008计算机二级考试:C语言基础教程-C语言字符型数据

    2.5.1字符常量 字符常量是指用一对单引号括起来的一个字符.如'a','9','!'.字符常量中的单引号只起定界作用并不表示字符本身.单引号中的字符不能是单引号(')和反斜杠(\),它们特有的表示法 ...

  8. c语言实验--字符编码,费诺编码的C语言实现实验论文.doc

    费诺编码的C语言实现实验论文 #include //头文件 #include #include #define Bmax 10 //最长码长度 #define Smax 20 //数组最大长度 /** ...

  9. matlab中字符表示,(专题一)07 matlab中字符串的表示

    matlab中,字符串使用单引号括起来的字符序列 >>xm='Central South University' >>xm(1:3) ans= Cen 截取1--3这三个字符, ...

  10. excel 替换 换行符_在Excel中查找和替换换行符

    excel 替换 换行符 When you want to create a line break (line feed) in a cell, you press Alt + Enter, to s ...

最新文章

  1. Android RecyclerView 基本使用
  2. linux如何添加默认路由表_Linux-如何添加路由表
  3. 一些SQL性能优化的实用经验
  4. Python 比特币 教程 之一:创建机器人
  5. 《分布式系统:概念与设计》一3.5.2 IEEE 802.11无线LAN
  6. 英学者研究60亿次通话记录发现:好友再多也没用,最好朋友就4个
  7. 腾讯后台开发面试题--整理1
  8. 【Linux】 linux的进程系统一点补充
  9. JUnit 3一个例子就懂
  10. Web端口复用正向后门研究实现与防御
  11. Multiresolution Recurrent Neural Networks: An Application to...
  12. 计算机专业术语全称及含义整理
  13. EpsonL360清零软件+清零方法
  14. 谈谈键盘A键不定期失灵问题
  15. openlayers 地图源
  16. Python的特殊属性和用法
  17. tree--树,最常见的复杂关系结构
  18. C语言对于轴对称图形输出的分析
  19. Centos7防火墙与IPTABLES详解
  20. 找出耗电大户进行消灭 电池持久有绝招——下载加速吧

热门文章

  1. Shell tips
  2. 实现网站的RSS应用
  3. 服务器负载暴涨以后...
  4. 第二届中国云计算与SaaS学术会议征文通知
  5. JavaScript中实现私有属性的写类方式(2)
  6. V神:随着时间的推移,我对链外数据L2越来越悲观
  7. 比特币现金是否失去了去中心化
  8. 前端性能优化之jQuery按需加载轮播图
  9. xshell 图形化连接ubuntu
  10. 软件工程概论课程总结