书上原话摘录如下(注意:【】中是我添加的,其它的均为书上原句,一个标点符号都没有错。):
++和--的结合方向是“自右至左”,见附录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编辑过]
----------------解决方案--------------------------------------------------------
的确有点让人摸不清头脑。别在这些模棱两可的句子上下功夫,只要弄清各自的功用就好了。
增量和减量运算符只能改变一个可修改的左值或右值,而不能改变一个表达式的值(-i是一个表达式了)。其优先级只有圆括号比它们高。
如:
i=3;
n=-i++;
++只影响i的值,既编译器先对表达式-i求值,将其值赋给变量n,再将i的值加1。
其实这里就是计算机和数学中的一个不同的地方。
数学中把-i当作一个数来看,而计算机则认为其是数i和符号运算符结合的一个表达式。
----------------解决方案--------------------------------------------------------
没错啊,若左结合,++后就成-2了
----------------解决方案--------------------------------------------------------
没错啊,若左结合,++后就成-2了
--你说对了,结果是-2呀
i=3;
i=-i++;
printf("%d\n", i);
这个结果是-2哦!
----------------解决方案--------------------------------------------------------
的确有点让人摸不清头脑。别在这些模棱两可的句子上下功夫,只要弄清各自的功用就好了。
增量和减量运算符只能改变一个可修改的左值或右值,而不能改变一个表达式的值(-i是一个表达式了)。其优先级只有圆括号比它们高。
如:
i=3;
n=-i++;
++只影响i的值,既编译器先对表达式-i求值,将其值赋给变量n,再将i的值加1。
其实这里就是计算机和数学中的一个不同的地方。
数学中把-i当作一个数来看,而计算机则认为其是数i和符号运算符结合的一个表达式。
--对,你这样说,很明白,不过,这样的运算顺序就是(-i)++了。这是不是说明他书上写错了?
----------------解决方案--------------------------------------------------------
要是我的话,我看到“前置++是先引用再参加运算,后置++是参加运算再自加”这个以后
后面我就不会看了,最多看一看例子的代码
楼上要是不懂就写代码实验吧,
千万不能写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/
----------------解决方案--------------------------------------------------------
--对,你这样说,很明白,不过,这样的运算顺序就是(-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编辑过]
----------------解决方案--------------------------------------------------------
[QUOTE]注意-(i++)是先用i的原值3加上负号输出-3,再对i加1,不要认为先加完1后再加负号,输出-4,这是不对的。
[/QUOTE]
简单的说其实他们都是运算表达式的值,怎么说呢!例如 -i++按结合性为右结合,先算出i++表达式的值如果i初值为3,则表达式的值为3,然后又与-构成一个表达式,计算出其值即为-3。
----------------解决方案--------------------------------------------------------
奇怪的代码(回产生歧义或让人不能确定什么意思的代码)最好不要写``````
能加括号最好加括号```以增强可阅读性````
----------------解决方案--------------------------------------------------------
我明白了!!!
有一点我搞混了: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;
----------------解决方案--------------------------------------------------------