免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: asker160
打印 上一主题 下一主题

[C++] 为什么把+++拆成++,+而不是+,++ [复制链接]

论坛徽章:
0
41 [报告]
发表于 2010-09-30 14:37 |只看该作者
有一点可以确定,设计上便于用户理解优先级或者实现上的贪心匹配什么的,都不关语言本身的事。对于语言而言,这就是“规定”,如此而已。
5 [Example: The program fragment x+++++y is parsed as x ++ ++ + y, which, if x and y are of built-in
types, violates a constraint on increment operators, even though the parse x ++ + ++ y might yield a
correct expression. ]
以上是C++03标准2.4一节中的原文。
53) The precedence of operators is not directly specified, but it can be derived from the syntax.
上面这段C++03标准原文是5 Expression的一行注释。
当然,标题里的问题对于人(而不是机器)来说倒仍然是有意义的。不过恐怕也不会因此能找到明确的“正确”答案。非得站在人类的理解或者机器的实现的角度吵着说“错了”的童鞋,都省省吧(根本是鸡同鸭讲嘛)。
按我的理解,根据奥卡姆剃刀原则,这里在语言的框架内讨论+++++是 ++ ++ + 还是 ++ + ++ 这类问题时,根本没必要引入“(运算符)优先级”这一实体概念(也大约因为如此,标准把上面的Example放在根本没有提到“优先级”的2.4而不是5)。这样,即便是要关注人对语言的理解,也没必要考虑“是不是因为优先级的关系”,因为实际上只要按这段注释里面所说的,通过语法约束推导对语义的影响就很容易明确在这里被表达的应该是何种明确的语义了。
要无视标准(这里看起来至少算作是一种建议的理解方法),不愿意这么理解的话也请自便。
(总觉得这倒是比“左值在不需要作为左值就只是右值”“月亮在你不看它时就不存在”之类的要明确多了。)

论坛徽章:
0
42 [报告]
发表于 2010-09-30 15:00 |只看该作者
回复 8# CountOnMyself


    童鞋,人家都关心背后的故事,你仍然按照小学生的思维啊

论坛徽章:
0
43 [报告]
发表于 2010-09-30 17:03 |只看该作者
楼主问题的本质是确定源代码中究竟有哪些 token
并不是要确定运算符的对象
确实与优先级无关

论坛徽章:
0
44 [报告]
发表于 2010-09-30 18:21 |只看该作者
本帖最后由 幻の上帝 于 2010-09-30 18:26 编辑
楼主问题的本质是确定源代码中究竟有哪些 token
并不是要确定运算符的对象
确实与优先级无关
KBTiller 发表于 2010-09-30 17:03


不一定。标题没有限定主语是人还是编译器。
按一般的人类的思维,语法和语义按直觉逻辑的辨识看来是可以多线程乱序执行的(如果知道语法的话)。 于是先看到表达式里面的token还是operator的问题,同各人的“实现”相关。

论坛徽章:
0
45 [报告]
发表于 2010-09-30 20:53 |只看该作者
不一定。标题没有限定主语是人还是编译器。
按一般的人类的思维,语法和语义按直觉逻辑的辨识看来是可 ...
幻の上帝 发表于 2010-09-30 18:21

我觉得程序员恰恰应该摆脱“按一般的人类的思维”
如果是写code,必须事先知道自己要写什么
如果是读code,正确的方式应该是编译器方式。因为程序设计语言不是自然语言,而是一种严格的形式语言

至于您说的多线程,我还没想通您想表达的是什么意思。能否麻烦更具体地说说么

论坛徽章:
0
46 [报告]
发表于 2010-09-30 21:08 |只看该作者
后置++比前置++优先级高
比如
int x;
++x++; //应该是编不过的,因为后置++优先级高, 等于下面一个
++(x++);//这个和上面一样,应该编不过,因为x++返回右值,不能自增
(++x)++;//这个可以编过

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
47 [报告]
发表于 2010-10-01 09:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
48 [报告]
发表于 2010-10-01 12:47 |只看该作者
本帖最后由 VIKING_nb 于 2010-10-01 12:53 编辑
逻辑混乱!
    我并没有说CSDN是因为某些幼儿园小班级别的提问而低级,你的所谓“CU的某些帖子 ...
pmerofc 发表于 2010-10-01 09:58


鄙视这个鄙视那个,你岂不是很牛X??????
莫装B,装B遭雷劈。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
49 [报告]
发表于 2010-10-01 13:12 |只看该作者
本帖最后由 zhaohongjian000 于 2010-10-01 17:09 编辑
后置++比前置++优先级高
比如
int x;
++x++; //应该是编不过的,因为后置++优先级高, 等于下面一个
++( ...
nwl586 发表于 2010-09-30 21:08



    麻烦您发贴前试试?而且前后++优先级相同,不同的是左右结合性。
------------------------------------------------------------------
这个地方说错了,前后++的结合性也是相同的,见53楼

论坛徽章:
0
50 [报告]
发表于 2010-10-01 14:50 |只看该作者
本帖最后由 nwl586 于 2010-10-01 15:11 编辑
麻烦您发贴前试试?而且前后++优先级相同,不同的是左右结合性。
zhaohongjian000 发表于 2010-10-01 13:12



    谢谢您的提醒,可能是我没说清楚
我的理解是这样的:
优先级是 后置++ > 前置++ > +
所以 x+++y 等于 (x++) + y 而不是 x + (++y)
如果按您所说前后++优先级相同, 它们左右结合性不同,又是怎么不同的呢, 可否写出来证明一下.
据我所知前后++都是右结合性.
再看下面这个例子:
x+++++y;
请问用左右结合性怎么解释它为什么编不过
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP