当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 关于i++的问题讨论

关于i++的问题讨论 时间:2018-09-29      来源:未知

这几天在讲c语言时,有学生问我 “(i++)+(++i)+(i++)”之类的问题,令我一时语塞,研究了半天。今天我要告诉你们,这样的语句是罪恶的。你们也许要说,这明明是考试重点呀。别急,下面我们分成三个部分来组织:在第一部分中,解释为什么它有罪;第二部分,为了解救你们,我们找出解题规律;在第三部分中,给出几个更变态的题目,今后谁出这种题给你,你就用我这里的题目去问他。

一. 这种语句的合法性

C语言的创始人D.M.R在《CPL》中明确指出:

自增与自减运算符只能作用于变量,类似于表达式(i+j)++是非法的。

自增运算实际上包括了一个赋值运算,而表达式不能作赋值运算的左值,因为它没有确定的内存地址。只要你明白 (i+j)=5 是非法的,那就不难理解为什么(i+j)++非法。以此为依据,(i++)+(i++)这个语句中的后一项,是非法的。尽管看起来它只是一个i++,但别忘了,在前一个i++的作用下,后面的“i”本身就已经是表达式了,表达式不能再做++。一般地,在一个语句中,对同一个变量调用多次自增或自减运算,都是非法的。D.M.R还提醒,编译器应在这种情况下给出警告。事实上,gcc确实会对此给出一个:Warning: operation on ‘i’ may be undefined

这已经够清楚了,无需多言。请编写教学大纲者注意,多年以来,你们一直在用非法语句作考试重点。

二.如何解释这种结果:

以 (i++)+(++i)+(++i)+(i++)+(i++) 为例:

计算步骤:

1. 先将所有的 i++ 改成 i ,然后在整个语句的后,统一将 i 自增相应的次数(语句中有几个 i++,就在后自增几次)。我们的例子,这时会变成 i+(++i)+(++i)+i+i; i++; i++; i++;

2. 按照加法的结合性,先将左起前两项相加。如果前两项中含有 ++i,则先算 ++i;

3. 前两项的和作为一项,与第三项相加,以此类推。同样,遇到 ++i,就先算 ++i。

以上就是编译器处理这种语句的规律,当然,这并不是C语言定义的,只是编译器在出错情况下的无奈之举。

三.实例如下:i=5;

1. 求j = (i++)+(++i)+(i++) 和i的值 , j=18, i = 8

按上面的方法做:

1)先把i++换到后面,变成 i + (++i) + i ; i++; i++;

2)从左到右累加,先拿出前两项 i + (++i)。先算 ++i,i 的值变成6,两项相加得12;

3)计算 12 +i,得18。

4)后面如果在打印i的值,则为8

2. 求j = (i++)+(i++)+(i++) 和 i 的值,j = 15, i = 8

按上面的方法做:

1)先把i++换到后面,变成 i + i + i ; i++; i++;i++;

2)从左到右累加,得到的值为15;

3)后面如果在打印i的值,则为8

3.求j = (++i)+(++i)+(++i) 和 i 的值, j = 22, i = 8

按上面的方法做:

1)从左到右累加,先拿出前两项 (++i) + (++i),先执行两次自增操作,第一次i的值变为6,第二次i的值变为7,然后再求值,7+7 = 14 。

2)14 + (++i) = 14+8 = 22;

3)后面如果在打印i的值,则为8

上一篇:WRTnode进阶篇: usb设备移植

下一篇:Hi3515 start.S文件分析

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部