运算顺序与 运算符优先级和结合性

类别:编程语言 点击:0 评论:0 推荐:

用户:走尽天涯路)

==================================================
消息组:群/校友录()
==================================================
消息类型:聊天记录
==================================================


Ricky...
“当一个运算对象左右两侧的运算符的优先级相同时,则由运算符的结合性,又称结合方向或互联性确定运算次序”何解?

2
我不知道你现在看的是什么书,不过我觉得C++Primer很好,你可以先多看看这本书

2004-12-18 19:35:06
书没有错,但是通常好书讲得比较透彻,并且会有很好的例子

2004-12-18 19:34:34 77)
哦...看来我的书说错了?

2004-12-18 19:37:35 77)
刚才走尽天涯路说“结合性 是判断 谁属于谁”是这样吗?
 

2004-12-18 19:38:17 13)
C语言中只有少数几个运算符是右结合的,所以当操作数左右两边运算符优先级相同的情况下,多是先算左边的……简单地说:和算术是一样的

2004-12-18 19:39:01 Ricky()
A+B+C,先算A+B,然后结果+C,不用弄得太复杂,需要注意的应该是优先级

2004-12-18 19:40:48 走尽天涯路(
没错 前提是不要写 二义性代码

2004-12-18 19:40:57 走尽天涯路(
[:D]

2004-12-18 19:41:19 Ricky(
如果再不能保证自己的记忆力足够好的时候,加上括号……

2004-12-18 19:42:33 走尽天涯路(7)
要看看 那本书上是怎么说的吗

2004-12-18 19:42:38 学C新手(7)
要~~~~

2004-12-18 19:45:48 走尽天涯路(
a= b+c+d ; 实际情况是 c标准 并没有对此做出明确的规定,在某些平台又或者某些情形下,可能编译器是这样的:
a = b+(c+d);

2004-12-18 19:46:22 走尽天涯路()
类似的 例子:
a = f( ) + g( );
 

2004-12-18 19:47:07 走尽天涯路()
编译器 并不保证 f( ) 一定在 g( ) 之前 被求值。

2004-12-18 19:48:51 Ricky(
第一个不正确,算术运算符都是左结合的,所以,一定是先b+c,然后结果+d

2004-12-18 19:49:21 学C新手()
[:L]书也能错啊?

2004-12-18 19:49:48 Ricky(1)
当年谭浩强的书就有很多错误

2004-12-18 19:50:20 走尽天涯路()
int i = 0;
while ( i<10 )
arrayTarger[i] = arraySource[i++];

是想:
while ( i<10 )
{ arrayTarget[i] = arraySource[i];
++i;}
 

2004-12-18 19:51:39 Ricky()
其实只有单目运算符、条件运算符还有赋值是右结合的,其他都是左结合

2004-12-18 19:52:32 走尽天涯路()
虽然i++返回自增前的i值,但问题是某些平台的编译器并不能保证在i自增之前执行取址操作:
arrayTarger[i]

2004-12-18 19:53:37 走尽天涯路()
Ricky 那个例子 是书上专门提出的

2004-12-18 19:53:59 走尽天涯路(
用的是 c99标准吧

2004-12-18 19:54:06 Ricky(1)
呵呵,如果你不介意的话可以看看Lippman的Essential C++

2004-12-18 19:54:43 走尽天涯路()
[:'(]没哪本书,还要去找啊

2004-12-18 19:55:20 学C新手()
你手里好歹有本编译原理,我还要买我这里买书特麻烦

2004-12-18 19:57:05 走尽天涯路()
最后一个例子是89年的 ,不好意思

2004-12-18 19:58:11 走尽天涯路(4)
这本书偏向于 c不知道 c++ 和c一样不

2004-12-18 20:04:19 走尽天涯路(
怎么都不说话了

2004-12-18 20:04:31 走尽天涯路(
[?]

2004-12-18 20:04:46 学C新手(
[:8]我现在更搞不清楚结合性了...
所谓从右向左结合是指运算符和右边的运算对象结合吗?a**p等价于a*(*p)?????

2004-12-18 20:05:18 走尽天涯路(
等啊

2004-12-18 20:05:47 Ricky(
这个不是运算符,是类型定义,是另外一回事情。
a**p 意味着 p是一个指针,是指向a*类型的指针

2004-12-18 20:05:58 走尽天涯路(
其实我觉得 这本书的意思是 结合性 和运算顺序是两码事

2004-12-18 20:06:31 Ricky(
同样的道理
const int * p,p是指针,指向const int类型
int * const p,p是指针常量,指向int类型

2004-12-18 20:06:39 走尽天涯路(
有联系 但不同

2004-12-18 20:06:58 Ricky(
int const * p等同于const int *p

2004-12-18 20:07:07 天堂没有雪(
哈哈

2004-12-18 20:07:15 Ricky(
在实际编程中,遇到的更多是优先级问题

2004-12-18 20:07:20 天堂没有雪(
a**p爽吧

2004-12-18 20:07:35 Ricky(
避免写出容易被误会的代码就好了

2004-12-18 20:07:35 学C新手(
[:8]不爽

2004-12-18 20:08:23 走尽天涯路(
Ricky[:)]

2004-12-18 20:08:42 /kun流星雨(
[?]

2004-12-18 20:08:45 Ricky(1
错了请大家指正,:)

2004-12-18 20:08:57 学C新手(
a**p 意味着 p是一个指针,是指向a*类型的指针
-----------------------------
int *p;
a*(*p)吧?

2004-12-18 20:09:50 天堂没有雪(
[strong]

7(走尽天涯路) 20:06:53
这是结合性问题
学C新手) 20:11:09
那位大哥重新把结合性的概念定义一下?我晕死了~~~~~
( 流星雨) 20:12:11
听听就好
(Ricky) 20:12:12
Sorry,这个就是表达式了,但是同样没有什么疑惑的啊,很明显就是a*(*p),因为取地址运算符的优先级别比算术运算符乘要高
(走尽天涯路) 20:08:41
那本书上说的例子是在 优先机相同情况下 运算顺序的问题 
当然不同时 运算顺序 和结合性 与 优先级 有密切关系
(学C新手) 20:14:39
Ricky讲讲结合性吧?我整个的概念被颠覆了
(分别说下一元和二元)
Ricky) 20:15:37
结合性本来是个很简单的东西,你自己把它想得太复杂了,想想看算术中是怎么计算表达式的。
(天堂没有雪) 20:18:24
你遇到过:a+b*c这样算吗(a+b)*c就按我们小学数学里的算就行了,干吗搞那么复杂,有些东西是跟你用的环境有关的


(Ricky) 20:19:24
除了单目运算符、条件运算符、赋值运算符以外,其他都是从左到右的。a+b-c,就是先加后减,定义int **p,那么**p = 5;就是*(*p) = 5,先取p指向的那个int指针,然后取该指针的内容,因为*是单目运算符,是先右后左的

(学C新手) 20:22:05
所谓结合性应该就是把运算符和运算对象结合起来?
(Ricky) 20:23:42
这里有一个"*",你知道它是乘法还是取内容吗?都要放到具体环境里面的,一开始写代码,吃不准就老老实实添加括号

本文地址:http://com.8s8s.com/it/it24276.htm