关于C语言中运算符的讨论.docVIP

  • 4
  • 0
  • 约5.39千字
  • 约 4页
  • 2017-11-20 发布于北京
  • 举报
关于C语言中运算符的讨论

关于C语言中++运算的讨论 姜文周 在C语言教学中讲到例1程序时输出结果分析没有问题。 例1程序 #include stdio.h main() { int i=2,l; k= i ++ + i++ +i++; printf(\n i=%d , k=%d,i,k); } 输出 i=5 ,k=6 在讲到例2时遇到了问题 例2 #include stdio.h main() { int i,l; i=2; k= ++i + ( ++i) + (++i); printf(\n i=%d , k=%d,i,k); } 原讲义中说是 输出 i=5 ,k=15 该讲义以前用过,所以备课时没有仔细分析,授课时学生分析结果应该是i=5 , k=12,当公布结果时引起学生的讨论,由于课堂时间有限没有仔细讨论,承诺下次课前专门讨论。 课后将例2程序在计算机上行发现了问题。 在TC 2.0编译器下运行,输出是:i=5 ,k=15 在VC 6.0编译器下运行,输出是:i=5 ,k=13 显然同一个程序在不同的编译器上运行结果不一样,引起兴趣。在百度网上搜索“++i+++i+++i ”看到了一些讨论的帖子,受到启发,首先看看这些帖子 贴1 j=(++i)+(++i)+(++i)=(((++i)+(++i))+(++i)) 计算机在计算j=(a+b)+(c+d)+(e+f)先计算(a+b)+(c+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改变了。 贴2 j=++i+++i+++i 根据最大可读入原则应该解释成 j=++(i++)+(i++)+i而++(i++)这个是有错误 因为 i++只能作为右值,而前增运算符需要左值。 而j=(++i)+(++i)+(++i)在不同的编译器中结果是不样的比如tuborC中为 15 VC中为13(象楼上鱼鹰说的) , 这和编译器的结构有关,讨论起来没有多少意义 。 结合帖子的讨论我们再看例2的处理过程。 i=2; k= ++i + ( ++i) + (++i); 我们将这个表达式分为A、B、C三个部分,具体如下: i=2; k= ++i + ( ++i) + (++i); A B C 通常的理解 按照C语言的算术优先级的定义,这个表达式的计算次序是: (1) 依据括号的优先级高及同级自左向右的规定,先计算B: 这时i的初值是2,经过++运算后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;处理结束。 TC的处理 例2的程序在TC 2.0编译器的处理下,输出的结果是i=5 ,k=15,这是为什么? 一个基本概念:编译器在对运算符进行处理时是采用堆栈的模式一次仅对该运算符的运算对象进行运算。 首先按照从左向右扫描:扫描到A部分后,再扫描遇到‘+’,因为‘++’运算符的优先级高于‘+’,因此执行‘++’运算符,但是并没有立即计算A表达式的值(++运算符的先加价后取值,在TC中表现为先执行完表达式中所有同级的运算,再取值),这时i的值变化为3; 继续扫描到B部分,同样先执行‘++’运算,i的值变为4,B表达式的值也没有计算; 同理对C部分处理后i的值变为5,C表达式的值也没有进行处理; 再继续扫描遇到‘;’,因此开始执行“取值”动作,这时i的值是5,因此A表达式的值为5、B表达式的值为5、C表达式的值为; 然后执行A+B运算得到结果为10,用T代表; 然后执行T+C运算得到结果15. 因此在TC编译器产生的执行程序计算结果为i=5 ,k=15 。 为了验证我们的分析是正确的,我们将程序修改为: #include stdio.h main() { int i,k,j; i=2; k=++i+ (++i) + (++i); printf(\n 1. i=%d ,

文档评论(0)

1亿VIP精品文档

相关文档