| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4222 人关注过本帖
标题:[求助] -i++ 这个表达式的值究竟是怎么算出来的????
只看楼主 加入收藏
adamhup
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-27
收藏
 问题点数:0 回复次数:14 
[求助] -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
lucyqixi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-7-4
收藏
得分:0 

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


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

2007-09-07 17:06
diver123
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-4-5
收藏
得分:0 

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

2007-09-07 17:25
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
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
要是我的话,我看到“前置++是先引用再参加运算,后置++是参加运算再自加”这个以后
后面我就不会看了,最多看一看例子的代码

楼上要是不懂就写代码实验吧,
千万不能写i = -i++;
这个是不定表达式,其值不确定,完全要看编译器


by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
2007-09-07 18:25
lucyqixi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-7-4
收藏
得分:0 
以下是引用adamhup在2007-9-7 17:49:32的发言:

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

不是,不是。
增量、减量只影响一个数值,而不能影响一个表达式。
如:
i=3;
n=-i++;
x=i;
在n=-i++;中,由于增量运算符在后,后对i自加,所以n得到的值是表达式-i的值。而i的值在内存中仍为3。在顺序点(即;)之前,编译器保证将i的值加1,即得4。所以在x=i;中,x将被赋值为4。
增量、减量和符号运算符的功用不同,虽然理论上拥有相同的优先级,但各自的功用导致不相矛盾。



i=3;
i=-i++;
printf("%d",i);
在i=-i++;中,将表达式-i的值赋给变量i,即为-3,在;前将i加1,得到-2。但这个表达式不同的编译器实现的情况不同,有的可能求出-i表达式的值后并不先赋给变量i,而是将内存中的i加1,再赋值。
在编程中要写出清晰易懂的代码,这样的代码很容易弄混的。不要在程序中出现这样的代码。

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

2007-09-07 18:40
小野猫
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-7-13
收藏
得分:0 
[QUOTE]注意-(i++)是先用i的原值3加上负号输出-3,再对i加1,不要认为先加完1后再加负号,输出-4,这是不对的。
[/QUOTE]
简单的说其实他们都是运算表达式的值,怎么说呢!例如 -i++按结合性为右结合,先算出i++表达式的值如果i初值为3,则表达式的值为3,然后又与-构成一个表达式,计算出其值即为-3。

2007-09-07 20:11
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
奇怪的代码(回产生歧义或让人不能确定什么意思的代码)最好不要写``````

能加括号最好加括号```以增强可阅读性````


女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-09-07 22:15
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
快速回复:[求助] -i++ 这个表达式的值究竟是怎么算出来的????
数据加载中...
 
   



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

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