| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4218 人关注过本帖
标题:[求助] -i++ 这个表达式的值究竟是怎么算出来的????
取消只看楼主 加入收藏
adamhup
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-27
收藏
 问题点数:0 回复次数:4 
[求助] -i++ 这个表达式的值究竟是怎么算出来的????
在谭浩强老师编写的《C程序设计教程》(请注意是教程,与《C程序设计》那本书不同的)中,在“数据类型、运算符与表达式”这一章中,在讲“自增自减运算符”时,有一段话,颇让我迷惑不解,请高手指点!!

书上原话摘录如下(注意:【】中是我添加的,其它的均为书上原句,一个标点符号都没有错。):

++和--的结合方向是“自右至左”,见附录C【即运算符优先级表】。前面已提到,算术运算符的结合方向为“自左而右”,这是大家所熟知的。如果有-i++,i的左面是负号运算符,右面是自加运算符。如果i的原值等于3,若按左结合性,相当于(-i)++,而(-i)++是不合法的,因为对表达式不能进行自加自减运算。

从附录C知道负号运算符“-”和“++”运算符同优先级,而结合方向也都是“自右至左”(右结合性),因此i先与其右的++结合,即它相当于-(i++),如果有printf("%d", -i++),则先取出i的值3,输出-i的值-3,然后i增值为4。注意-(i++)是先用i的原值3加上负号输出-3,再对i加1,不要认为先加完1后再加负号,输出-4,这是不对的。


这段话的意思我感到迷惑,红色字体标识的两句话不是明显的自相矛盾嘛?这是怎么一回事呢?请高手指点一下啊!谢谢!

[此贴子已经被作者于2007-9-7 17:50:44编辑过]

搜索更多相关主题的帖子: 运算符 谭浩强 程序设计 表达 
2007-09-07 15:45
adamhup
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-27
收藏
得分:0 
以下是引用diver123在2007-9-7 17:25:06的发言:

没错啊,若左结合,++后就成-2了

--你说对了,结果是-2呀
i=3;
i=-i++;
printf("%d\n", i);

这个结果是-2哦!


博学之,审问之,慎思之,明辨之,笃学之。 吾日三省吾身! 愿与大家共进步!
2007-09-07 17:47
adamhup
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-27
收藏
得分:0 
以下是引用lucyqixi在2007-9-7 17:06:06的发言:

的确有点让人摸不清头脑。别在这些模棱两可的句子上下功夫,只要弄清各自的功用就好了。
增量和减量运算符只能改变一个可修改的左值或右值,而不能改变一个表达式的值(-i是一个表达式了)。其优先级只有圆括号比它们高。
如:
i=3;
n=-i++;
++只影响i的值,既编译器先对表达式-i求值,将其值赋给变量n,再将i的值加1。


其实这里就是计算机和数学中的一个不同的地方。
数学中把-i当作一个数来看,而计算机则认为其是数i和符号运算符结合的一个表达式。

--对,你这样说,很明白,不过,这样的运算顺序就是(-i)++了。这是不是说明他书上写错了?


博学之,审问之,慎思之,明辨之,笃学之。 吾日三省吾身! 愿与大家共进步!
2007-09-07 17:49
adamhup
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-27
收藏
得分:0 

我明白了!!!

有一点我搞混了:i++是针对i的值的变化,而j = -i++; 是个赋值表达式,它的作用是从右向左计算,而i++的作用是先引用i的值,然后再把i值加1,这样j = -i++; 就会运算-i的值,并把该值赋值给j,所以j的值是-3,而i的值为4。
若i=3; 要求j = -i++; 的值
则:i++,后置运算,该表达式实际上变为:j = -i; i = i+1;



博学之,审问之,慎思之,明辨之,笃学之。 吾日三省吾身! 愿与大家共进步!
2007-09-07 22:49
adamhup
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-27
收藏
得分:0 
我的理解有问题,谭老师写的也有些混淆了,呵呵,在这里要多多感谢大家的帮助!!我们一起学好C语言吧!

博学之,审问之,慎思之,明辨之,笃学之。 吾日三省吾身! 愿与大家共进步!
2007-09-07 22:51
快速回复:[求助] -i++ 这个表达式的值究竟是怎么算出来的????
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012419 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved