我们一直在工作中进入不必要的编码论证.今天我询问条件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
Ruby:
true == true == true
Run Code Online (Sandbox Code Playgroud)
语法错误,意外的tEQ
与JavaScript:
true == true == true
// => true
Run Code Online (Sandbox Code Playgroud)
与C:
1 == 1 == 1
// => 1
Run Code Online (Sandbox Code Playgroud) ruby operators syntax-error operator-precedence associativity
在PHP手册中,我在"操作员"下找到以下"用户提供的注释 ".
请注意,在php中,三元运算符?:具有左关联性,与C和C++不同,它具有正确的关联性.
你不能编写这样的代码(正如你在C/C++中习惯的那样):
Run Code Online (Sandbox Code Playgroud)<?php $a = 2; echo ( $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'four' : 'other'); echo "\n"; // prints 'four'
我实际上尝试它,它真的打印four.但是,我无法理解它背后的原因,仍然觉得它应该打印two或other.
有人可以解释一下这里发生了什么,为什么打印'四'?
数学上,函数组合操作是关联的.因此:
f . (g . h) = (f . g) . h
Run Code Online (Sandbox Code Playgroud)
因此,功能组合操作可以被定义为左关联或右关联.
由于Haskell中的正常函数应用(即术语的并置,而不是$操作)在我看来是左联想的,因此函数组合也应该是左联的.毕竟世界上大多数人(包括我自己)习惯于从左到右阅读.
然而,Haskell中的函数组合是正确的关联:
infixr 9 .
Run Code Online (Sandbox Code Playgroud)
我知道函数组合操作是左关联还是右关联并没有什么区别.尽管如此,我很想知道它为什么不留下联想.我想到这个设计决定有两个原因:
$操作类似.除了笑话,在Haskell中,函数组合是否存在正确联想是否有任何有益的理由?如果Haskell中的函数组合是左对联的,它会有什么不同吗?
我正在讨论C运营商的关联性话题.
在那里我遇到了这个事实,函数调用操作符()具有从左到右的关联性.但是,当表达式中出现相同优先级的多个运算符时,关联性才会发挥作用.但我找不到涉及函数调用运算符的任何示例,其中关联性起着至关重要的作用.
例如,在语句中a = f(x) + g(x);,结果取决于评估顺序,而不取决于两个函数调用的关联性.类似地,调用f(g(x))将g()首先评估函数,然后是函数f().这里我们有一个嵌套的函数调用,并且再次关联不起任何作用.
此优先级组中的其他C运算符是数组下标[],postfix ++和postfix --.但我找不到任何涉及这些运算符组合的例子,()其中关联性在表达式评估中起作用.
所以我的问题是函数调用的关联性是否从左到右定义影响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标准.我再一次惊讶地发现在运算符优先级和关联性方面提到的很少.
该逻辑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
什么时候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) 我是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课程,并不是一个好主意.这只是一个说明性的比较.
associativity ×10
c ×2
c++ ×2
haskell ×2
ansi-c ×1
c# ×1
conditional ×1
ecmascript-5 ×1
javascript ×1
magrittr ×1
operators ×1
php ×1
r ×1
ruby ×1
syntax-error ×1