在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?
为什么前缀增量运算符在赋值之前都不同于后缀?
在操作关联性方面,我很确定我不理解一些非常重要的东西.
请注意,这与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)
还是它的实现定义了?
如果有保证,你能引用吗?
这只是出于好奇,我总是在这些情况下写括号.
准备删除问题,如果有这样的话.
它不应该是左联想吗?
我觉得
let a = b ?? c ?? d
被分组像
let a = (b ?? c) ?? d
不
let a = b ?? (c ?? d)
但它被宣布为右联盟.我误解或错过了什么吗?
operators null-coalescing-operator associativity custom-operator swift
在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 的不同行为如何使第二个单行输出成为空行?
我知道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 .
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提供正确的运算符优先级和关联表吗?
在任何编程语言教科书中,我们总是被告知该语言中的每个运算符如何具有左或右相关性.似乎关联性是任何运算符的基本属性,无论它采用多少操作数.在我看来,无论我们如何将关联性分配给其他运算符,我们都可以为任何运算符分配任何关联性.
但为什么会这样呢?也许一个例子更好.假设我想设计一种假设的编程语言.以任意方式为这些运算符分配关联性是否有效(所有这些都具有相同的优先级):
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
我正在编写自己的编程语言,并且我完成了令牌器(词法分析器).但是对于解析,我在编写递归下降解析器时遇到了麻烦.它似乎是正确的联想,应该留下,我不知道为什么.例如,它解析1-2-3为1-(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) 确实Parsec具有chainl和chainr解析左关联或右关联操作链(即a -> a -> a)。所以我可以很容易地x + y + z以 a((a + y) + z)或(a + (y + z))方式解析某些东西。
然而,
a -> b -> c 函数和特定情况的标准方法a = b:a -> a -> c例如a = b = c认为是比较函数 ( a -> a -> Bool);a + b = b + a应该被解析为((a + b) = (b …