谈到C中运算符的关联性,我想知道为什么具有相同优先级的运算符之间存在差异关联性.例如,后缀增量和后缀减少有左关联性; 而前缀增量和前缀减量具有正确的相关性.对于所有相同的优先级运算符,只有左右关联性是不是很简单?
那背后有什么理由吗?
根据此表,函数应用程序关联到左侧.那是什么意思?当二元运算符多次出现时,相关性很重要,例如a - b - c.这与功能应用有什么关系?如果函数应用程序与右侧相关联,它将如何不同?
在完成学校作业时,我们不得不对操作员重载和模板做些什么.一切都很酷.我写:
template<class T>
class Multiplication : public Expression<T>
{
private:
typename std::shared_ptr<Expression<T> > l, r;
public:
Multiplication(typename std::shared_ptr<Expression<T> > l, typename std::shared_ptr<Expression<T> > r) : l(l), r(r) {};
virtual ~Multiplication() {};
T evaluate() const
{
std::cout << "*";
T ml = l->evaluate();
T mr = r->evaluate();
return ml * mr;
};
};
Run Code Online (Sandbox Code Playgroud)
然后一位朋友问我为什么他的代码以"错误"的顺序产生输出.他有类似的东西
T evaluate() const
{
std::cout << "*";
return l->evaluate() * r->evaluate();
};
Run Code Online (Sandbox Code Playgroud)
r->evaluate()之前打印调试信息的代码l->evaluate().我也在我的机器上进行了测试,只需将这三条线改为单线.
所以,我想,那么*应该是从右到左的联想.但在互联网上,他们说这是从左到右.有一些额外的规则吗?使用模板时可能有些特别之处?或者这是VS2012中的错误?
我正在尝试了解左联想语法和右联想语法的工作原理,我需要一些帮助。所以我决定举一个例子并要求一些澄清。基本上,我想为两个逻辑操作创建语法:and+ implication。我想让它成为and左关联和implication右关联。这是我到目前为止所得到的。它是否正确?我感觉可能有歧义。(我还记得 的and优先级高于implication)
<exp> := <and>
<and> := <impl> | <and> ^ <impl>
<impl> := <term> | <term> -> <impl>
<term> := (<exp>) | <bool>
<bool> := true | false
Run Code Online (Sandbox Code Playgroud) 据我了解有关Haskell的褶皱,foldl (-) 0 [1..5]给出的结果是-15通过计算0-1-2-3-4-5,并foldr (-) 0 [1..5]给出了结果-5的计算5-4-3-2-1-0.为什么那么这两个foldl (++) "" ["a", "b", "c"]和foldr (++) "" ["a", "b", "c"]给出的结果"abc",而结果foldr是不,相反,"cba"?
有什么我缺少理解之间的差异foldl和foldr?
haskell functional-programming binary-operators fold associativity
对于我通过 Coq 编写群论的项目,显然 3 个元素的关联性是给定的,但是我正在努力证明它适用于长度为 n 的字符串。也就是说, (x1 * ... * xn) 总是相同的,无论有多少括号,或者有多少位置。相关的组代码是
Structure group :=
{
e : G;
Op : G -> G -> G;
Inv : G -> G;
Associativity : forall (x y z : G), Op x (Op y z) = Op (Op x y) z;
LeftInverse : forall (x : G), Op (Inv x) x = e;
LeftIdentity : forall (x : G), Op e x = x;
}.
Run Code Online (Sandbox Code Playgroud)
这不是我有问题的证据本身,而是如何对其进行编码。我可以看到至少我需要一个进一步的函数来允许我对字符串进行操作而不仅仅是元素,但我不知道如何开始。任何指针?
这个例子:
++structure.field;
Run Code Online (Sandbox Code Playgroud)
增量field而不是给“错误类型参数增量”编译器错误,尽管++和。运营商是平等的分层ergo:应该从左到右执行。
我在这里错过了什么吗?
拜托,有人能帮我弄清楚为什么平等在这里后缀之前具有更高的优先级吗?
int x = 6;
System.out.println(7 == x++);
Run Code Online (Sandbox Code Playgroud)
输出: false
根据Java中运算符优先级的一些来源:后缀应该比相等运算符具有更高的优先级。在这些来源中还提到了运算符的结合性(但当表达式中运算符的优先级相同时,它应该进来)。
java equality operator-precedence associativity post-increment
例:
select count(*) from my table
where
column1 is not null
and
(column1 = 4 OR column1 = 5)
Run Code Online (Sandbox Code Playgroud)
例2:
select count(*) from my table
where
column1 is not null
and
column1 = 4 OR column1 = 5
Run Code Online (Sandbox Code Playgroud)
在我的数据库中有真正的列名,我得到两个不同的结果.带括号的那个是对的,因为如果我这样做:
select count(*) from my table
where
column1 is not null
and
column1 = 4
Run Code Online (Sandbox Code Playgroud)
然后
select count(*) from my table
where
column1 is not null
and
column1 = 5
Run Code Online (Sandbox Code Playgroud)
并将它们加在一起,我得到正确答案......我想.与上面括号的第一个示例相同.
为什么通过更改OR测试的优先级会得到不同的结果?
请查看以下代码段:
int a = 10, b;
b = (a) + (++a); //2
printf("b = %d\n", b);
Run Code Online (Sandbox Code Playgroud)
输出:
b = 22
Run Code Online (Sandbox Code Playgroud)
在声明2中,有4个不同的运算符.其中()优先级最高.由于()操作员的关联性是从左到右为什么b = 22而不是21?
$ gcc --version
gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Run Code Online (Sandbox Code Playgroud)