6

使用方括号 [] 的 Objective-C 消息表达式(消息表示法)运算符是否与数组下标的 C 运算符具有相同的优先级,后者也使用方括号 []?

我参考了这张 C 运算符表

此外,与用于“通过引用选择元素”的 C 运算符相比,类似的问题适用于用于访问器方法调用的 Objective-C“点语法”运算符。它们的优先级相同吗?

我花了一个小时寻找这个基本问题的直接、明确的答案。令人惊讶的是,我没有找到一个。因此,这个问题。欢迎链接。

4

2 回答 2

7

您已经感到困惑,因为许多对语法和优先级的解释都采取了说运算符具有优先级的捷径。他们没有。语法中的产生具有优先权,并且它们相对于其他产生具有优先权。只有当语法不明确(意味着它可以为相同的输入产生两个不同的分析树)并且通过指定一个产生式的优先级来解决歧义时,两个产生式相对于彼此的优先级才有意义.

让我用一个例子来解释。

这是一个玩具语法:

expression =
    | IDENTIFIER
    | NUMBER
    | expression '+' expression
    | expression '*' expression
    | expression '(' expression ')' // function call
    | '(' expression ')' // grouping
    | expression '[' expression ']' // array subscript
    | '[' expression IDENTIFIER ':' expression ']' // message send
    ;

现在,考虑1 + 2 * 3用这个语法进行解析。有两个有效的解析树:

  +              *
 / \            / \
1   *          +   3
   / \        / \
  2   3      1   2

通过指定*产生式的优先级高于+产生式,我们要求解析器产生左树而不是右树。+因此,产生式和产生式之间的优先关系的想法是*有道理的:它对解析器的输出有影响。

同样,1 + foo(3)有两个解析树:

  +               ()
 / \             /  \
1   ()          +    3
   /  \        / \
 foo   3      1  foo

因此,“+”产生式和函数调用产生式之间的优先关系的想法再次有意义。的情况1 + foo[3](使用下标产生代替函数调用产生)是类似的,因此指定“+”产生和下标产生之间的优先关系是有意义的。

现在考虑1 + (2 * 3)。该文法只能产生一种可能的解析树:

  +
 / \
1  ( )
    |
    *
   / \
  2   3

产生式和分组产生式之间不需要优先关系+,因为只有一种方法可以解析这个输入。指定分组产生式比产生式具有更高的优先级是没有意义的+,因为没有其他解析树可以通过这样做产生。

最后,考虑1 + [2 add:3]。这类似于分组示例。只有一种可能的解析树:

   +
  / \
 /   \
1   [ ]
   / | \
  /  |  \
 2  add  3

没有其他解析树是可能的。不需要指定+生产和消息发送生产之间的优先关系。指定它们之间的优先关系不会产生任何影响,因为语法根本不允许以任何其他方式解析此输入。

于 2013-03-12T21:29:43.170 回答
1

它们属于同一优先级组。我相信消息 send [] 等同于 () 因为运行时在消息的情况下将它们视为括号。

http://www.techotopia.com/index.php/Objective-C_2.0_Operator_Precedence

于 2013-03-12T20:40:19.577 回答