运算符结合方向问题

boy8765 2003-07-13 06:16:24
对于诸如1+2*3+4、*++pointer之类的表达式,有关运算符结合方向问题(左结合先还是右结合先)我总是会搞混淆。现把自己对上述这两个表达式的有关运算符结合方向问题的理解(很可能是不对的)写出来,请各位网友指点,不胜感激!

我的理解:
对于运算符结合方向问题考虑的步骤为。
(1)、先看相邻两个运算符的优先级。
(2)、确定运算符的优先级后,再确定一个操作数。用于进行运算。

下面举例说明:
对于1+2*3+4,相邻两个运算符是+和*,*的运算符的优先级高。再确定一个操作数,现为2。回过头来,由于*是左结合性,所以是这样结合——2*。当得出值后。1+2*3+4这个表达式变为1+6+4。重复上述步骤。+和+是同级运算符,先第一个+,由于+是左结合性,所以操作数先是1,也就是说,第一个+先与1结合。运算后表达式1+6+4变为7+4……
上述这个问题的描述,我还能写出一些,对于下面这个例子,我不大能描述出来,请网友原谅。
对于*++pointer,我知道它等同于*(++pointer).我的描述是:
由于*和++是同优先级,所以是*先开始运算(这是不是错了?),确定操作数时,操作数应确定为右边的整个东西——++pointer(我理解*是左结合性,*应该与右边的整体——++pointer进行结合。这是不是又错了?)。经过上述两个步骤——— (1)、先看相邻两个运算符的优先级。(2)、确定运算符的优先级后,再确定一个操作数。用于进行运算。————后,我就认为,对于*++pointer,它等同于*(++pointer).

我是电脑菜鸟,刚接触C不久,也没有人指点,只是凭自己的理解来学C,也不懂自己理解的对不对。请各位网友不吝教!



...全文
556 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbs1982xl 2003-07-13
  • 打赏
  • 举报
回复
++和--,&属于同一级别,优先级为2,结合方向为自右至左
*和/,%的优先级未,结合方向为自左至右
+和-的优先级为4,结合方向为自左至右
要是实在分不清,就多用圆括号,省事还能看懂
bigtea 2003-07-13
  • 打赏
  • 举报
回复
补充一下,自右至左,不管叫什么别名,应该是指
* ++的情况下,先是++,后*
与此对应是加号+和减号-(结合性是自左至右)
+ - 那自然是先+,后-.
bigtea 2003-07-13
  • 打赏
  • 举报
回复
(1) 由于*和++是同优先级,所以是*先开始运算(这是不是错了?)
正确,在C中++与*的优先级相同,且++,*(此处是指指针运算符)都是自右至左结合,且都是单目运算符。
我认为这应该叫右结合性。
所以
* ++pointer<==> *(++pointer)<==> pointer=pointer+1; * pointer;
同样
* pointer++ <==> * (pointer++)<==> * pointer;pointer=pointer+1;(右结合发挥作用)
(2)我想规则是:
(1)先找优先级最高的运算符,满足其结合性。
(2)次之,依此类推。
antijpn 2003-07-13
  • 打赏
  • 举报
回复
*和++应该不是同级吧?反正在C++标准里面规定了++高于*
leafxx 2003-07-13
  • 打赏
  • 举报
回复

我觉得也是,除了考试爱考这样的变态的问题:一大堆的++ --挤在一块,自己写程序还是多用
()的比较好
redolive 2003-07-13
  • 打赏
  • 举报
回复
同意,为了在把别人搞糊涂之前不把自己搞糊涂,最好先规范自己的编码习惯---多用()。

另: 及时是同一种语言,运算符的结合方向也不尽相同,当然是由编译器决定的了。所以要逃避这个问题还是用()好/。
MaiCle 2003-07-13
  • 打赏
  • 举报
回复
结合方向,运算优先级啊这类的,不必花过多时间去推敲,不懂的情况下,按照你想要的顺序,用括号将他们一一括上,就解决问题了.
mahatma_cn 2003-07-13
  • 打赏
  • 举报
回复
最好不要写这么难以理解的代码,可以用括号扩起来。
不要以能写出这么让别人难理解的代码而高兴一整天。
因为这样对提高程序效率没有任何帮助,编译器会优化而使目标代码一模一样(sometimes)。
反而让人家难以理解。
boy8765 2003-07-13
  • 打赏
  • 举报
回复
……(我理解*是左结合性,*应该与右边的整体——++pointer进行结合。这是不是又错了?)。……
应当为……(我理解*是右结合性,*应该与右边的整体——++pointer进行结合。这是不是又错了?)。……

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧