标签: associativity

C中的运算符关联性具体为前缀和后缀的递增和递减

在C操作中,关联性就是增量,减量和赋值.

  2. postfix ++ and -- 
  3. prefix ++ and -- 
  16. Direct assignment = 
Run Code Online (Sandbox Code Playgroud)

完整列表可在此处找到维基百科运营商

我的问题是我们何时拥有

int a, b;

b = 1;
a = b++;

printf("%d", a); // a is equal to 1

b = 1;
a = ++b;

printf("%d", a); //a is equal to 2
Run Code Online (Sandbox Code Playgroud)

当后缀增量运算符应该在直接赋值之前发生时,为什么用b ++等于1?

为什么前缀增量运算符在赋值之前都不同于后缀?

在操作关联性方面,我很确定我不理解一些非常重要的东西.

c operation associativity

4
推荐指数
2
解决办法
8656
查看次数

C/C++中的运算符优先级和关联性

请注意,这与Operator Precedence ..()和++,未定义的行为和序列点无关,为什么这些构造(使用++)是未定义的行为?以及关于此的数百个类似问题


简而言之:标准保证了协会性吗?

详细示例:来自维基百科关于运算符优先级的文章,operator*并且operator/具有相同的优先级,它们是Left-to-right运算符.这是否意味着,标准保证,这:

int res = x / y * z / t;
Run Code Online (Sandbox Code Playgroud)

将被评估为

int res = ( ( x / y ) * z ) / t;
Run Code Online (Sandbox Code Playgroud)

还是它的实现定义了?

如果有保证,你能引用吗?


这只是出于好奇,我总是在这些情况下写括号.
准备删除问题,如果有这样的话.

c c++ operator-precedence associativity

4
推荐指数
2
解决办法
666
查看次数

为什么Nil合并运算符右关联?

它不应该是左联想吗?

我觉得 let a = b ?? c ?? d 被分组像 let a = (b ?? c) ?? d let a = b ?? (c ?? d)

但它被宣布为右联盟.我误解或错过了什么吗?

operators null-coalescing-operator associativity custom-operator swift

4
推荐指数
1
解决办法
237
查看次数

除非 - 和"if!"的不同行为如何?语句在标量上下文中影响范围运算符?

http://novosial.org/perl/one-liner/上,我找到了以下两个单行.输出是不同的,因为该unless语句不同于if !(由于关联性和优先级规则).

cat file:  
foo  



bar  
perl -ne 'print unless /^$/../^$/' file  
foo  
bar  
perl -ne 'print if ! /^$/../^$/' file  
foo  

bar  

if !-statement 的不同行为如何使第二个单行输出成为空行?

perl operator-precedence associativity

3
推荐指数
1
解决办法
442
查看次数

有没有快速的方法来确定运营商的优先级和关联性?

我知道perlop.我正在寻找的是像GHCi :info命令一样的快速查找:

ghci> :info (+)
class (Eq a, Show a) => Num a where
    (+) :: a -> a -> a
    ...
    -- Defined in GHC.Num
infixl 6 +
Run Code Online (Sandbox Code Playgroud)

我学习的地方(+)是左联想的,并且该infixl 6 +行的优先级别为6 .

perl operator-precedence associativity

3
推荐指数
1
解决办法
205
查看次数

java中( - i + ++ i)中表达式的输出

int i=9;
System.out.println(--i + ++i);
Run Code Online (Sandbox Code Playgroud)

执行时的输出:17
i的最终值是:9

但是根据java中的关联性和优先级规则,我应该首先执行,即从右到左执行10,然后--i给出9 ..添加两者,答案应该是19 ...至于我知道这样的代码在C/C++中给出了未定义的行为,但在java中,规则是严格定义的,并且没有序列点的概念.所以,任何人都可以澄清问题,因为我真的很困惑这个?还有一些书中提到后增量和后减量运算符是LTR关联的.但是在其他一些书中,它给出了所有增量和减量(post和pre)都是RTL关联的.!! 任何人都可以为java提供正确的运算符优先级和关联表吗?

java operator-precedence associativity

3
推荐指数
1
解决办法
2754
查看次数

为什么关联性是运算符的基本属性而不是优先级的基本属性

在任何编程语言教科书中,我们总是被告知该语言中的每个运算符如何具有左或右相关性.似乎关联性是任何运算符的基本属性,无论它采用多少操作数.在我看来,无论我们如何将关联性分配给其他运算符,我们都可以为任何运算符分配任何关联性.

但为什么会这样呢?也许一个例子更好.假设我想设计一种假设的编程语言.以任意方式为这些运算符分配关联性是否有效(所有这些都具有相同的优先级):

unary operator: 
! right associative 
binary operators:
+ left associative
- right associative
* left associative 
/ right associative
Run Code Online (Sandbox Code Playgroud)

!+ - */是我的5个运算符都具有相同的优先级.

如果是的话,我的假设解析器如何将2 + 2!3 + 5*6/3-5!3!3-3*2这样的表达式括起来?为什么呢.

编辑:

第一个例子(2 + 2!3 + 5*6/3-5!3!3-3*2)不正确.也许忘记一元操作,让我这样说,我们可以分配具有相同优先级的运算符,就像我上面的方式一样具有不同的关联性吗?如果是,将如何评估一个例子,比如2 + 3-4*5/3 + 2?因为大多数编程语言似乎为具有相同优先级的运算符分配相同的关联性.但我们总是谈论操作者关联性,就好像它是个体操作者的属性 - 而不是优先级的属性.

programming-languages operators operator-precedence associativity

3
推荐指数
2
解决办法
880
查看次数

为什么我的递归下降解析器是右关联的

我正在编写自己的编程语言,并且我完成了令牌器(词法分析器).但是对于解析,我在编写递归下降解析器时遇到了麻烦.它似乎是正确的联想,应该留下,我不知道为什么.例如,它解析1-2-31-(2-3),而不是正确的(1-2)-3.

我已经删除了大部分其他代码,只留下了可重复的内容:

using System.Collections.Generic;

namespace Phi
{
    public enum TokenType
    {
        Plus, // '+'
        Minus, // '-'
        IntegerLiteral,
    }

    public interface INode
    {
        // Commented out as they aren't relevant
        //NodeType GetNodeType();
        //void Print(string indent, bool last);
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Token> tokens = new List<Token>()
            {
                new Token(TokenType.IntegerLiteral, "1"),
                new Token(TokenType.Minus, ""),
                new Token(TokenType.IntegerLiteral, "2"),
                new Token(TokenType.Minus, ""),
                new Token(TokenType.IntegerLiteral, "3"),
            };

            int consumed = ParseAdditiveExpression(tokens, out INode …
Run Code Online (Sandbox Code Playgroud)

c# recursive-descent associativity

3
推荐指数
1
解决办法
486
查看次数

用`Parsec`解析各种二元函数链的正确方法?

确实Parsec具有chainlchainr解析左关联或右关联操作链(即a -> a -> a)。所以我可以很容易地x + y + z以 a((a + y) + z)(a + (y + z))方式解析某些东西。

然而,

  1. 在以下情况下没有解析a -> b -> c 函数和特定情况的标准方法a = ba -> a -> c例如a = b = c认为是比较函数 ( a -> a -> Bool);
  2. 没有标准的方法来实现一个操作的“重要性”:例如a + b = b + a应该被解析为((a + b) = (b …

parsing haskell parsec operator-precedence associativity

3
推荐指数
1
解决办法
1067
查看次数

关于算子优先级的信息冲突

我最近在Kenneth A. Reek的C书上读过Pointers.这本书有一个很好的C运算符表和它们的优先级.但是,当我检查其他资源以确保书中提供的信息是正确和最新的时,我看到有不同的信息.我将提供精确的例子来说明我的意思.

本书提供了一个函数调用运算符()具有最高优先级的表.后缀增量和减量运算符正在追赶.我检查了其他资源来验证信息.我已经检查了这个资源和这个资源和这个资源.这些资源中提供的优先级信息与Cinter上的指针中的说明相匹配.问题从cppreference中的优先级表开始,因为它具有与其他资源不同的优先级规则.

我错过了什么吗?

c expression operator-precedence associativity

2
推荐指数
1
解决办法
85
查看次数