C运算符的优先级和结合律?

cmoan 2012-10-05 07:09:08
C运算符的优先级和结合律,是针对没有副作用的表达式!这种计算方法与数学公式的计算相类似。
如:a[1]+3*7;
有副作用的表达式,就不能用这种方法来计算了!对于计算机来说,它是错误的表达式。
如:x=x++;
对否?
...全文
239 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhcosin 2012-10-11
  • 打赏
  • 举报
回复
楼主连这个是编译器决定的还是 CPU 决定的都没搞清楚。
赵4老师 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
引用 11 楼 的回复:
楼主高超,对于副作用,本菜鸟一概不懂,既然程序按执行顺序来执行,编译器做了规范,就应该不会有什么副作用,否则就不可以顺利运行吧?

再次重申 副作用无可避免
再次重申 副作用不含贬义
再次重申 执行顺序有时候是不明确的
[/Quote]
我想这个世界如果没有所谓的副作用,可能也不会进化出人类吧。(^_^)
lin5161678 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
楼主高超,对于副作用,本菜鸟一概不懂,既然程序按执行顺序来执行,编译器做了规范,就应该不会有什么副作用,否则就不可以顺利运行吧?
[/Quote]
再次重申 副作用无可避免
再次重申 副作用不含贬义
再次重申 执行顺序有时候是不明确的
lin5161678 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
赵老师, 是不是不应该考虑这么多呢?当遇到疑惑的,完全可以加个括号的啊[/Quote]

面对由实现定义 未明确 未定义 行为 不是仅仅加一个括号就能解决的
lin5161678 2012-10-09
  • 打赏
  • 举报
回复
不对 优先级和结合性适用于任何的合法表达式[PS 合法在这里指的是没有ERROR] 但是
合法的表达式 可能会涉及未定义行为
你的 x=x++ 就是 解释为 x = (x++) 这一点是没有疑问的 明确无二义的
但是 是先得到 x=x 还是 先完成x++的副作用 这个是不确定的 所以 x的值会是多少也是无法确定的

然后 副作用是无法避免的 副作用也不是什么不好的东西 不含贬义的
赵4老师 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
引用 1 楼 的回复:

C/C++ code

// C++ Operator Precedence and Associativity
// The highest precedence level is at the top of the table.
//+------------------+-----------------------------------------+……
[/Quote]
问题是你阅读的是人家没加括号的源代码,而且这段代码可能还无法单步调试看对应汇编。
hu7324829 2012-10-09
  • 打赏
  • 举报
回复
看置顶的帖子!!
max_min_ 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

C/C++ code

// C++ Operator Precedence and Associativity
// The highest precedence level is at the top of the table.
//+------------------+-----------------------------------------+---------------+
……
[/Quote]
赵老师, 是不是不应该考虑这么多呢?当遇到疑惑的,完全可以加个括号的啊!
无声的告别 2012-10-09
  • 打赏
  • 举报
回复
围观赵老师。
AnYidan 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
C运算符的优先级和结合律,是针对没有副作用的表达式!这种计算方法与数学公式的计算相类似。
如:a[1]+3*7;
有副作用的表达式,就不能用这种方法来计算了!对于计算机来说,它是错误的表达式。
如:x=x++;
对否?
[/Quote]

不对
iamnobody 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 2 楼 的回复:
汗!
那个,自己编译试过没有?
能编译通过的就是合法表达式,最多是其运行结果为定义还是未定义什么的。


你说他以后会变成supermegaboy还是赵老师
[/Quote]

这个....
wzb56 2012-10-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

C/C++ code

// C++ Operator Precedence and Associativity
// The highest precedence level is at the top of the table.
//+------------------+-----------------------------------------+---------------+
……
[/Quote]


又学习了,一遍。好!!!!
CD344549214 2012-10-05
  • 打赏
  • 举报
回复
楼主高超,对于副作用,本菜鸟一概不懂,既然程序按执行顺序来执行,编译器做了规范,就应该不会有什么副作用,否则就不可以顺利运行吧?
taodm 2012-10-05
  • 打赏
  • 举报
回复
选错一本教材,那就是一场噩梦。

[Quote=引用 5 楼 的回复:]
引用 2 楼 的回复:
汗!
那个,自己编译试过没有?
能编译通过的就是合法表达式,最多是其运行结果为定义还是未定义什么的。


你说他以后会变成supermegaboy还是赵老师
[/Quote]
ForestDB 2012-10-05
  • 打赏
  • 举报
回复
CPU哪里知道表达式,所有的这一切,都是由compiler翻译成CPU知道的机器语言。
当然语言是由人定的,compiler也是由人实现的。
明白这一点很重要。

拿x = x++;这句话来说,首先,由于人的能力/认知的限制,语言规范可能无法定义它的行为(起码早期是没有想到此问题的,只有在实现compiler的时候,发现这样的语句,才发现语言规范没有定义;即使是这样,标准也不一定要定义此类规范,也许是不值得,所以一直就是未定义行为),但是compiler还是要处理此类边界行为,既然没有规范定义,那么各compiler的实现者就可以选择按他自己的理解或者想法来实现。

说句题外话,我以前也是很看重标准的,但是后来稍稍淡了些,为什么呢?
首先,人的能力/认知是有限的,法律够严谨标准了吧,其实仔细想想,还是有很多漏洞的。
其次,即使是标准,不同的人理解还是有差异的,比如compiler的实现,再如web标准。而且这种差异,有时是跟利益相关的,所有人都达成agreement,是需要部分人放弃一些利益的,涉及到利益的人,就复杂了。
newtee 2012-10-05
  • 打赏
  • 举报
回复
编译器规则也是人规定 存在即是合理
newtee 2012-10-05
  • 打赏
  • 举报
回复
有副作用的表达式,就不能用这种方法来计算了!对于计算机来说,它是错误的表达式。
如:x=x++;
没错的,如

int x=1;
x=x++;
printf("%d",x);
输出2
armsword 2012-10-05
  • 打赏
  • 举报
回复
楼主,本人提个醒,建议最好把你问的问题结贴。
jackyjkchen 2012-10-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
汗!
那个,自己编译试过没有?
能编译通过的就是合法表达式,最多是其运行结果为定义还是未定义什么的。
[/Quote]

你说他以后会变成supermegaboy还是赵老师
taodm 2012-10-05
  • 打赏
  • 举报
回复
楼主,那你现在就需要一本计算机原理的书了,这超过本版的讨论范围了。
总之,cpu对“表达式”这个概念可称为一无所知的。
[Quote=引用 3 楼 的回复:]
CPU是怎样计算没副作用的表达式?
[/Quote]
加载更多回复(3)

69,371

社区成员

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

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