关于单目运算符结合性的一个问题

橡皮擦 2012-03-21 08:32:39
例如, *p++;

因为单目运算符是自右向左结合的,所以上句应该等价于 *(p++);
但是根据词法分析器的贪心法,上句应该解释成 (*p)++;

这应该怎么解释呢?
...全文
439 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
graint1 2012-03-23
  • 打赏
  • 举报
回复
好吧,检讨一下,刚刚没有看清楚16楼的两个文档,确实将前缀++/--和后缀++/--分开分级了,
后缀++/--在第二级,前缀++/--在第三级
讨论学术问题不能热血上脑,认真检讨!
graint1 2012-03-23
  • 打赏
  • 举报
回复
说白了我对词法分析器真心没什么了解,编译原理也只是介绍一些词法分析器的简单算法,如果要完整的了解C语言的语法分析器到底是如何实现的。。这个。。打入贝尔实验室去学习吧
橡皮擦 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 graint1 的回复:]

引用 15 楼 ohayou 的回复:
此歪解
和*同级的是前缀++/--,后缀的优先级比*高


这个结论牛B了,你找找看哪个文档有把前缀和后缀的++/--的优先级分开来说
另外,第16楼提供的最后两个链接,*,++/--都是第三级的优先级,根本没有区别

至于17楼说的C99标准,我表示英文原版我也有,但是不找不到哪里有提到优先级问题

LZ提到的贪心法只是语法分析器的一……
[/Quote]

具体的问题是不是得看编译原理这本书才能搞懂?
graint1 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ohayou 的回复:]
此歪解
和*同级的是前缀++/--,后缀的优先级比*高
[/Quote]

这个结论牛B了,你找找看哪个文档有把前缀和后缀的++/--的优先级分开来说
另外,第16楼提供的最后两个链接,*,++/--都是第三级的优先级,根本没有区别

至于17楼说的C99标准,我表示英文原版我也有,但是不找不到哪里有提到优先级问题

LZ提到的贪心法只是语法分析器的一种做法,但是并不是在任何地方都适用,贪心算法本身就不是适用于任何情况,很多问题使用贪心法无法得到最优解
橡皮擦 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ohayou 的回复:]

贪心只在词法分析 就是从整个源文件里解析出不同的标识符运算符之类的
就是说比如a+++++b会解析成a ++ ++ + b
而你举这个例子*p++解析成* p ++ 至于之后的结合顺序是在下一步语法分析
建议查阅编译原理
[/Quote]


谢谢,有点小懂了
ohayou 2012-03-23
  • 打赏
  • 举报
回复
贪心只在词法分析 就是从整个源文件里解析出不同的标识符运算符之类的
就是说比如a+++++b会解析成a ++ ++ + b
而你举这个例子*p++解析成* p ++ 至于之后的结合顺序是在下一步语法分析
建议查阅编译原理
橡皮擦 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 graint1 的回复:]

引用 8 楼 anyidan 的回复:

同优先级,看结合律,从右到左,即 *p++ == *(p++); 所以是指针递增,但其效果要到下一句才反应在程序中,所以解指针操作的操作树仍然是原来的 p 值;

等价与:*P;
P++;

LZ 可以试试 *++p; 等价与(++p; *p;)


此正解,再举个例子,++*p,是对*p进行自增1,而不是对p指针进行自增,所以这里*……
[/Quote]


我的问题不是关于结合性的,是++运算符和词法分析器的“贪心法“, 他们两个是不是矛盾, 因为从贪心法分析就会得到另一个结论
自信男孩 2012-03-22
  • 打赏
  • 举报
回复
优先级是++高于*,所以*p++等同于:*(p++);如果把*p++作为表达式的右值,那么是将p指向的空间的值赋值给左值,然后指针指向下一个单元。
qixing1115 2012-03-22
  • 打赏
  • 举报
回复
优先级先搞清楚,然后再说是从左到还还是从右到左
bluewanderer 2012-03-22
  • 打赏
  • 举报
回复
贪心算法是说 +++ 解析为 ++ +而不是+ ++
AnYidan 2012-03-22
  • 打赏
  • 举报
回复
同优先级,看结合律,从右到左,即 *p++ == *(p++); 所以是指针递增,但其效果要到下一句才反应在程序中,所以解指针操作的操作树仍然是原来的 p 值;

等价与:*P;
P++;

LZ 可以试试 *++p; 等价与(++p; *p;)
巫师 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 graint1 的回复:]
引用 12 楼 a971124568 的回复:

c陷阱与缺陷 第21页 说的*与++,--的运算级相同, 难道是这本书错了??


没有错,在《The C Programming Language (Second Edition)》中的优先级列表中就有,*跟++,--是同样的,这个问题的关键在于,*,++,--都是从右至左的结合性,因此*p++是从右边开始结合的

上面的,说优先级……
[/Quote]
最权威的是c语言的iso标准文档。至少c99规定优先级是不同的。
yulinlang 2012-03-22
  • 打赏
  • 举报
回复
对于前缀自增自减和后缀自增自减运算符的优先级差异,请参看下面几处:

C语言参考手册第五版 P146 表7.3 C语言运算符
C Prime Plus 第五版 P572 表B.1 C运算符
C和指针 P81 表5.1 操作符优先级
C语言程序设计:现代方法第二版 P524 C语言运算符
C++程序设计语言特别版 P107 6.2 运算符概览
C++ Primer中文版(第4版) P147 表5-4 操作符的优先级
http://www.cplusplus.com/doc/tutorial/operators/
http://en.cppreference.com/w/cpp/language/operator_precedence
ohayou 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 graint1 的回复:]
引用 8 楼 anyidan 的回复:

同优先级,看结合律,从右到左,即 *p++ == *(p++); 所以是指针递增,但其效果要到下一句才反应在程序中,所以解指针操作的操作树仍然是原来的 p 值;

等价与:*P;
P++;

LZ 可以试试 *++p; 等价与(++p; *p;)


此正解,再举个例子,++*p,是对*p进行自增1,而不是对p指针进行自增,所以这里*就……
[/Quote]
此歪解
和*同级的是前缀++/--,后缀的优先级比*高
graint1 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 anyidan 的回复:]

同优先级,看结合律,从右到左,即 *p++ == *(p++); 所以是指针递增,但其效果要到下一句才反应在程序中,所以解指针操作的操作树仍然是原来的 p 值;

等价与:*P;
P++;

LZ 可以试试 *++p; 等价与(++p; *p;)
[/Quote]

此正解,再举个例子,++*p,是对*p进行自增1,而不是对p指针进行自增,所以这里*就比++更先生效了
谁还敢说++比*更优先
graint1 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 a971124568 的回复:]

c陷阱与缺陷 第21页 说的*与++,--的运算级相同, 难道是这本书错了??
[/Quote]

没有错,在《The C Programming Language (Second Edition)》中的优先级列表中就有,*跟++,--是同样的,这个问题的关键在于,*,++,--都是从右至左的结合性,因此*p++是从右边开始结合的

上面的,说优先级的一律拖出去100大板!!!
橡皮擦 2012-03-22
  • 打赏
  • 举报
回复
c陷阱与缺陷 第21页 说的*与++,--的运算级相同, 难道是这本书错了??
巫师 2012-03-21
  • 打赏
  • 举报
回复
IEC ISO/IEC 9899:1999 (E)
6.5 Expressions
角注
71)The syntax specifies the precedence of operators in the evaluation of an expression, which is the same as the order of the major subclauses of this subclause, highest precedence first.

6.5.2 Postfix operators
Syntax
1 postfix-expression:
primary-expression
postfix-expression [ expression ]
postfix-expression ( argument-expression-listopt )
postfix-expression . identifier
postfix-expression -> identifier
postfix-expression ++
postfix-expression --
( type-name ) { initializer-list }
( type-name ) { initializer-list , }

6.5.3 Unary operators
Syntax
1 unary-expression:
postfix-expression
++ unary-expression
-- unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-name )
unary-operator: one of
& * + - ~ !
巫师 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 a971124568 的回复:]

他们两个的优先级是一样的
[/Quote]
谁说的?
yulinlang 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 a971124568 的回复:]

他们两个的优先级是一样的
[/Quote]

他们两个的优先级真的不一样,后缀自增自减操作符的优先级比*高一级,前缀自增自减操作符的优先级才和*一样。
加载更多回复(4)

69,382

社区成员

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

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