【问题标题】:Does precedence & associativity group operators or operands?优先级和关联性是否分组运算符或操作数?
【发布时间】:2014-08-05 18:08:27
【问题描述】:

通过阅读“C++ Primer”一书和维基百科,我注意到两者都提到“优先级和关联性定义了操作员的分组”。但是,在我看来,他们给出的示例显示了操作数的分组。我在这里引用:

来自“定义术语@C++ Primer 5th edition”:

关联性:确定具有相同优先级的操作员如何 分组。

来自Operator_associativity @ Wikipedia

考虑表达式 a ~ b ~ c。如果运算符 ~ 已经离开 结合性,这个表达式将被解释为 (a ~ b) ~ c。如果 运算符具有右结合性,表达式为 解释为 a ~ (b ~ c)。

但据我所知,上述解释将两个操作数(不是运算符)分组:a 和 b 归入 (a ~ b),或 b 和 c 归入 (b ~ c)。因为我看到他们用括号括了两个操作数,而不是两个运算符。

鉴于运算符和操作数是不同的概念,优先级和关联性规则是否对运算符或操作数进行分组?

提前致谢。

【问题讨论】:

  • 这似乎是关于数学术语的问题,而不是编程问题。编程讨论将从假设您对代数概念有所了解开始。编译器编写者确实担心编写代码(基本上是解析器)来实现优先级和关联性,但您的问题似乎与此无关。
  • 感谢 cmets。我在阅读 C++ 书籍时提出了这个问题。通过阅读前面的章节,我意识到 C++ 术语通常是严格定义的。所以当我遇到上述两个术语时,我习惯性地双重确认。
  • 这是没有区别的区别。您不能对运算符进行分组而不对操作数进行分组,反之亦然。
  • @user3701346:啊,C++ 仔细定义了语言规则中使用的术语。这些条款不是。您的书在讨论中使用它们,如果它们与代数不同,则由书来澄清定义。

标签: c++


【解决方案1】:

优先级和关联性解决语言如何解释涉及三个或更多操作数的无括号表达式。我将使用符号#@ 来表示两个运算符。考虑表达式

  • a @ b # c,
  • x # y @ z,
  • d @ e @ f,和
  • u # v # w

请注意,前两个表达式涉及不同的操作数。 C++ 优先规则决定a@b#c 是否解释为(a@b)#ca@(b#c),以及x#y@z 是否解释为x#(y@z)(x#y)@z

后两个表达式涉及相同的操作数。优先级在这里没有任何意义。是关联性决定了d@e@f 是否被解释为含义(d@e)@fd@(e@f),以及u#v#w 是否被解释为含义(u#v)#wu#(v#w)


C++ 有大量的运算符。有一个简单的方法来处理过多的优先级:使用括号。我的规则是“每个人都知道a*b+c 的意思是(a*b)+c。除了语言律师之外没有人知道a?b:c=d 的意思是(a?b:c)=d 还是a?b:(c=d)。如有疑问,请使用括号。”

注意:显然,即使是微软和维基百科也不知道“a?b:c=d 是什么意思?”的正确答案,至少截至 2014 年 6 月 16 日。wikipediaMicrosoft 的优先级表有三元运算符与低优先级赋值运算符分开,这是不正确的。这意味着a?b:c=d 需要被解释为(a?b:c)=d,它总是将d 的值分配给bc,这取决于a 是真还是假。这是不正确的。正确的解释是a?b:(c=d)cppreference.comcplusplus.com 的优先级表正确地将三元运算符与赋值运算符分组。

有一个更好的解决方案来解决标准所说的问题:只需使用括号。

【讨论】:

    【解决方案2】:

    鉴于运算符和操作数是不同的概念,优先级和关联性规则是否对运算符或操作数进行分组?

    两者兼而有之。它将操作数和相应的运算符分组。在:

    (a ~ b) ~ c
    

    您正在通过~ 运算符对ab 进行分组,它们是操作数。不过,优先级和关联性只是操作数的属性。

    【讨论】:

    • 好的。所以它确实意味着操作数的分组。我只是想确保这本书没有(再次)重新定义一般数学术语。
    【解决方案3】:

    语言的关联性规则指定当两个具有相同优先级的运算符在表达式中相邻时,首先计算哪个运算符。

    语言的优先级规则指定当两个具有不同优先级的运算符在表达式中相邻时,首先计算哪个运算符。

    Wiki 说:

    [..] 运算符的关联性(或固定性)是一个属性,它决定了相同优先级的运算符在没有括号的情况下如何分组。如果操作数前后都有运算符(例如,"^ 4 ^"),并且这些运算符具有相同的优先级,则该操作数可以用作两个不同操作的输入(即两个运算符指示的两个操作)。将操作数应用于哪些操作的选择取决于操作符的“关联性”。

    这意味着运算符在操作数之间分组,操作数在运算符之间分组。

    【讨论】:

    • 好的,这是一种解释。我只是想确保这两个术语没有在 C++ 中重新定义。
    • @user3701346;没有。没有重新定义。
    • @user3701346 - C++ 本身并没有重新定义这些术语。本标准不使用这些术语。该标准不是为温血人类编写的。它是为通常被称为“语言律师”的冷血爬行动物物种而写的。从那种冷血的语言中提取优先级表是一项艰巨的任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2019-11-06
    • 2012-08-13
    • 2014-10-22
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多