关于c语言中运算符的讨论

关于c语言中运算符的讨论

ID:8992729

大小:52.50 KB

页数:4页

时间:2018-04-14

关于c语言中运算符的讨论_第1页
关于c语言中运算符的讨论_第2页
关于c语言中运算符的讨论_第3页
关于c语言中运算符的讨论_第4页
资源描述:

《关于c语言中运算符的讨论》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、关于C语言中++运算的讨论姜文周在C语言教学中讲到例1程序时输出结果分析没有问题。例1程序#include"stdio.h"main(){inti=2,l;k=i+++i+++i++;printf("i=%d,k=%d",i,k);}输出i=5,k=6在讲到例2时遇到了问题例2#include"stdio.h"main(){inti,l;i=2;k=++i+(++i)+(++i);printf("i=%d,k=%d",i,k);}原讲义中说是输出i=5,k=15该讲义以前用过,所以备课时没有仔细分析,授课时学生分析结果应该是

2、i=5,k=12,当公布结果时引起学生的讨论,由于课堂时间有限没有仔细讨论,承诺下次课前专门讨论。课后将例2程序在计算机上行发现了问题。在TC2.0编译器下运行,输出是:i=5,k=15在VC6.0编译器下运行,输出是:i=5,k=13显然同一个程序在不同的编译器上运行结果不一样,引起兴趣。在百度网上搜索“++i+++i+++i”看到了一些讨论的帖子,受到启发,首先看看这些帖子贴1j=(++i)+(++i)+(++i)=(((++i)+(++i))+(++i))计算机在计算j=(a+b)+(c+d)+(e+f)先计算(a+b)+(c

3、+d),并把结果存储(例如:存储在j中),然后再计算j+(e+f)=j;所以计算机先计算了两个++i(前两项i为3,++i先于+号);也就是j=3+3;然后j=6+(++i)(最后的i为4),也就是j=6+4=10。首先++i=2,再计算第二个++i=3,此时计算机里i=3,第一个i也=3,第二个i也=3,因为计算机里只有一个i,因此原式=(3+3)+4=10,记住计算机里只有一个i,算第二个时第一个i改变了。贴2j=++i+++i+++i根据最大可读入原则应该解释成j=++(i++)+(i++)+i而++(i++)这个是有错误因为

4、i++只能作为右值,而前增运算符需要左值。而j=(++i)+(++i)+(++i)在不同的编译器中结果是不样的比如tuborC中为15VC中为13(象楼上"鱼鹰"说的),这和编译器的结构有关,讨论起来没有多少意义。结合帖子的讨论我们再看例2的处理过程。i=2;k=++i+(++i)+(++i);我们将这个表达式分为A、B、C三个部分,具体如下:i=2;k=++i+(++i)+(++i);ABC1.通常的理解按照C语言的算术优先级的定义,这个表达式的计算次序是:(1)依据括号的优先级高及同级自左向右的规定,先计算B:这时i的初值是2,

5、经过++运算后i的值变为2,B表达式的值为3;(2)然后计算C:这时i的初值是3,经过++运算后i的值变为4,C表达式的值为4;(3)然后计算A:这时i的初值是4,经过++运算后i的值变为5,C表达式的值为5;(4)然后将计算表达式A+B的值,5+3,结果为8;这个结果用D表示。(5)然后将计算表达式D+C的值,8+4,结果为12;(6)因此我们12作为整个表达式的结果并赋给K;处理结束。1.TC的处理例2的程序在TC2.0编译器的处理下,输出的结果是i=5,k=15,这是为什么?一个基本概念:编译器在对运算符进行处理时是采用堆栈的

6、模式一次仅对该运算符的运算对象进行运算。(1)首先按照从左向右扫描:扫描到A部分后,再扫描遇到‘+’,因为‘++’运算符的优先级高于‘+’,因此执行‘++’运算符,但是并没有立即计算A表达式的值(++运算符的先加价后取值,在TC中表现为先执行完表达式中所有同级的运算,再取值),这时i的值变化为3;(2)继续扫描到B部分,同样先执行‘++’运算,i的值变为4,B表达式的值也没有计算;(3)同理对C部分处理后i的值变为5,C表达式的值也没有进行处理;(4)再继续扫描遇到‘;’,因此开始执行“取值”动作,这时i的值是5,因此A表达式的值为

7、5、B表达式的值为5、C表达式的值为;(5)然后执行A+B运算得到结果为10,用T代表;(6)然后执行T+C运算得到结果15.因此在TC编译器产生的执行程序计算结果为i=5,k=15。为了验证我们的分析是正确的,我们将程序修改为:#include"stdio.h"main(){inti,k,j;i=2;k=++i+(++i)+(++i);printf("1.i=%d,k=%d",i,k);i=2;k=++i+(++i)+(++i)+(++i);printf("2.i=%d,k=%d",i,k);i=2;k=++i++

8、+i+++i;printf("3.i=%d,k=%d",i,k);i=2;k=++i+++i+++i+++i;printf("4.i=%d,k=%d",i,k);i=2;k=++i+++i+10+++i;printf(

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。