标签: associativity

什么是运营商的相关性以及为什么重要?

什么是关联性(对于运营商)以及为什么重要?

更新:操作员关联性

associativity

80
推荐指数
6
解决办法
5万
查看次数

C#条件AND(&&)OR(||)优先级

我们一直在工作中进入不必要的编码论证.今天我询问条件AND(&&)或OR(||)是否具有更高的优先级.我的一个同事坚持认为他们有同样的优先权,我有疑虑,所以我查了一下.

根据MSDN AND(&&)具有比OR(||)更高的优先级.但是,你能向持怀疑态度的同事证明这一点吗?

http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx

bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as 
bool result = false || (true && false); // --> false
Run Code Online (Sandbox Code Playgroud)

所以我的问题是你如何用代码证明AND(&&)的优先级高于OR(||)?如果你的答案无关紧要,那么为什么用这种语言建立?

c# conditional conditional-operator operator-precedence associativity

70
推荐指数
4
解决办法
5万
查看次数

65
推荐指数
2
解决办法
3391
查看次数

三元运算符左侧相关性

在PHP手册中,我在"操作员"下找到以下"用户提供的注释 ".

请注意,在php中,三元运算符?:具有左关联性,与C和C++不同,它具有正确的关联性.

你不能编写这样的代码(正如你在C/C++中习惯的那样):

<?php 
$a = 2; 
echo ( 
    $a == 1 ? 'one' : 
    $a == 2 ? 'two' : 
    $a == 3 ? 'three' : 
    $a == 4 ? 'four' : 'other'); 
echo "\n"; 
// prints 'four' 
Run Code Online (Sandbox Code Playgroud)

我实际上尝试它,它真的打印four.但是,我无法理解它背后的原因,仍然觉得它应该打印twoother.

有人可以解释一下这里发生了什么,为什么打印'四'?

php ternary-operator associativity

37
推荐指数
3
解决办法
8369
查看次数

为什么Haskell中的函数组合是正确的?

数学上,函数组合操作是关联的.因此:

f . (g . h) = (f . g) . h
Run Code Online (Sandbox Code Playgroud)

因此,功能组合操作可以被定义为左关联或右关联.

由于Haskell中的正常函数应用(即术语的并置,而不是$操作)在我看来是左联想的,因此函数组合也应该是左联的.毕竟世界上大多数人(包括我自己)习惯于从左到右阅读.

然而,Haskell中的函数组合是正确的关联:

infixr 9 .
Run Code Online (Sandbox Code Playgroud)

我知道函数组合操作是左关联还是右关联并没有什么区别.尽管如此,我很想知道它为什么不留下联想.我想到这个设计决定有两个原因:

  1. Haskell的制造商希望功能组合在逻辑上与$操作类似.
  2. Haskell的制造者之一是日本人,他发现使函数组合成为正对联而不是左联合更直观.

除了笑话,在Haskell中,函数组合是否存在正确联想是否有任何有益的理由?如果Haskell中的函数组合是左对联的,它会有什么不同吗?

haskell associativity function-composition

32
推荐指数
1
解决办法
8146
查看次数

C中函数调用操作符的相关性

我正在讨论C运营商的关联性话题.

在那里我遇到了这个事实,函数调用操作符()具有从左到右的关联性.但是,当表达式中出现相同优先级的多个运算符时,关联性才会发挥作用.但我找不到涉及函数调用运算符的任何示例,其中关联性起着至关重要的作用.

例如,在语句中a = f(x) + g(x);,结果取决于评估顺序,而不取决于两个函数调用的关联性.类似地,调用f(g(x))g()首先评估函数,然后是函数f().这里我们有一个嵌套的函数调用,并且再次关联不起任何作用.

此优先级组中的其他C运算符是数组下标[],postfix ++postfix --.但我找不到任何涉及这些运算符组合的例子,()其中关联性在表达式评估中起作用.

所以我的问题是函数调用的关联性是否从左到右定义影响C中的任何表达式?任何人都可以提供一个示例,其中函数调用运算符的关联性()在表达式求值中是否重要?

c associativity

31
推荐指数
2
解决办法
2541
查看次数

谁定义了C运算符优先级和关联性?

介绍

在C/C++的每本教科书中,您都可以找到运算符优先级和关联表,如下所示:

运算符优先级和关联表

http://en.cppreference.com/w/cpp/language/operator_precedence

StackOverflow上的一个问题是这样的:

以下函数的执行顺序如下:

f1() * f2() + f3();
f1() + f2() * f3();

参考上面的图表,我自信地回答说函数具有从左到右的关联性,因此在前面的语句中,在这两种情况下都会像这样评估:

f1() - > f2() - > f3()

评估函数后,您完成评估,如下所示:

(a1*a2)+ a3
a1 +(a2*a3)

令我惊讶的是,很多人告诉我,我错了.决心证明他们错了,我决定转向ANSI C11标准.我再一次惊讶地发现在运算符优先级和关联性方面提到的很少.

问题

  1. 如果我认为函数总是从左到右进行评估是错误的,那么表中涉及函数优先级和关联性的真正含义是什么?
  2. 谁定义了运算符优先级和关联性,如果它不是ANSI?如果是ANSI的定义,为什么很少提到运算符优先级和关联性?运算符优先级和关联性是从ANSI C标准推断还是在数学中定义?

c c++ operator-precedence associativity ansi-c

26
推荐指数
3
解决办法
8249
查看次数

为什么JavaScript中的逻辑运算符是关联的?

逻辑AND和OR运算是在JavaScript中只有懒运营三元一起条件运算符.他们使用以下规则进行短路评估测试:

false && anything === false
true || anything === true
Run Code Online (Sandbox Code Playgroud)

这与在Haskell中实现的方式相同:

(&&) :: Bool -> Bool -> Bool
False && _ = False
True  && x = x

(||) :: Bool -> Bool -> Bool
True  || _ = True
False || x = x
Run Code Online (Sandbox Code Playgroud)

但是根据MDN,JavaScript中的逻辑运算符是左关联的.这是违反直觉的.在我的拙见中,他们应该是正确的联想.Haskell做对了.Haskell中的逻辑运算符是正确的关联:

infixr 3 &&
infixr 2 ||
Run Code Online (Sandbox Code Playgroud)

考虑Haskell中的以下表达式:

False && True && True && True
Run Code Online (Sandbox Code Playgroud)

因为&&在Haskell中是正确关联的,所以上面的表达式相当于:

False && (True && (True && True))
Run Code Online (Sandbox Code Playgroud)

因此,表达式 …

javascript haskell logical-operators associativity ecmascript-5

25
推荐指数
2
解决办法
1684
查看次数

operator <<何时指向插入运算符以及何时指向左移位?

什么时候operator <<引用插入操作符,什么时候引用按位左移?

这将输出10,并operator <<指向左移.

cout << a.b() << a.a.b << endl;  
Run Code Online (Sandbox Code Playgroud)

这将输出11,operator <<指的是插入运算符.

cout << a.b();
cout << a.a.b ;
Run Code Online (Sandbox Code Playgroud)

我很困惑,什么时候operator <<(使用时cout)会参考左移算子?

#include <iostream> 
using namespace std; 

class A { 
public:
    A() { a.a = a.b = 1; }

    struct { int a, b; } a;

    int b(); 
}; 

int A::b(){
    int x=a.a;
    a.a=a.b;
    a.b=x; 
    return x;
};

 int main(){
    A a; 
    a.a.a = 0; 
    a.b(); …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading associativity

23
推荐指数
5
解决办法
3023
查看次数

R中从右到左的操作员关联性可能吗?

我是R的新手,我刚刚发现我患有Bracket Phobia(请参阅链接中的评论).我喜欢magrittr表示法的%>%工作方式,因为它在某些情况下避免了嵌套的括号,并使代码更具可读性.我来自Mathematica哪里,有一个非常相似的原生//符号来做什么%>%.以下是一些R和Mathematica比较:

#R Notation    
c(1.5,-2.3,3.4) %>% round %>% abs %>% sum  
Run Code Online (Sandbox Code Playgroud)

#Mathematica Notation
{1.5,-2.3,3.4}//Round//Abs//Total
Run Code Online (Sandbox Code Playgroud)

到目前为止很好,但是,我的问题是:

有没有办法模仿Mathematica @ notation,从右到左的关联性R

以下是它在Mathematica中的工作原理,以解决上面相同的代码:

Total@Abs@Round@{1.5,-2.3,3.4}
Run Code Online (Sandbox Code Playgroud)

在Mathematica中,它也可以写成:

Total[Abs[Round[{1.5,-2.3,3.4}]]]
Run Code Online (Sandbox Code Playgroud)

就像R它会是:

sum(abs(round(c(1.5,-2.3,3.4))))
Run Code Online (Sandbox Code Playgroud)

但是在这样的事情中会更加干净(而且很酷)R:

sum@abs@round@c(1.5,-2.3,3.4)
Run Code Online (Sandbox Code Playgroud)

PS:我知道@用于S4课程,并不是一个好主意.这只是一个说明性的比较.

wolfram-mathematica r associativity magrittr

21
推荐指数
3
解决办法
523
查看次数