标签: operator-precedence

Haskell中缀函数应用程序优先级

我们f x y = x * y.我们可以通过两种方式应用此函数:f 5 6或者,使用中缀表示法5 `f` 6.运算符规则是否适用于最后一个表达式?这个应用程序有什么优先权?它只是另一种形式的功能应用程序,它也具有最高优先级吗?

我想编译器会看到这种特殊形式(由于``和/或名称以字母(?)开头),并且实际上将其视为普通函数应用程序,而不是将其视为运算符.

haskell function operators infix-notation operator-precedence

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

当#defines正在使用其他#defines时,顺序是否重要?

根据这个问题的答案,以下代码是合法的:

#define three 3
#define nine three*3

int main()
{
    std::cout << nine;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,它编译并运行良好.但是,上述问题的答案还指出,应该注意这些#define指令的顺序,并且#define应该在它们之前定义将在其他s中使用的指令.但是以下代码:

#define nine three*3
#define three 3

int main()
{
    std::cout << nine;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行良好,并打印"9".

我的编译器是否让我轻松,或者订单确实与使用其他#defines的#defines无关?编译是否会在更复杂的项目中失败?

值得一提的是,上述问题涉及C,而我的代码是C++.这是(假设的)行为差异的来源吗?

c++ operator-precedence c-preprocessor

24
推荐指数
2
解决办法
3559
查看次数

Python中"in"的优先级

这是一个(非常基本的)语言律师问题.我理解代码的作用以及原因,所以请不要用基本的解释.

在表达式中,in具有更高的优先级and.所以,如果我写

if n in "seq1" and "something":
    ...
Run Code Online (Sandbox Code Playgroud)

它被解释就像

if (n in "seq1") and "something":
    ...
Run Code Online (Sandbox Code Playgroud)

然而,in一个的for循环具有的优先级低于and(其实它有,否则下面的是一个语法错误).因此,如果Python初学者写道

for n in "seq1" and "something":
    ...
Run Code Online (Sandbox Code Playgroud)

......,它相当于:

for n in ("seq1" and "something"):
    ...
Run Code Online (Sandbox Code Playgroud)

(如果"seq1"是真实的,则评估为for n in "something").

那么,问题是:in指定/记录for循环关键字的优先级在哪里?我理解这n in ...不是这个上下文中的表达式(它没有值),但它是for语句语法的一部分.不过,我不确定如何/在哪里指定非表达式优先级.

python syntax operator-precedence

24
推荐指数
2
解决办法
1104
查看次数

C++后缀表达式未定义与未指定的行为

提前道歉,我知道评估订单的一般主题已经有很多SO问题.但是,看过它们之后,我想澄清一些我认为不等于重复的具体要点.假设我有以下代码:

#include <iostream>

auto myLambda(int& n)
{
    ++n;
    return [](int param) { std::cout << "param: " << param << std::endl; };
}

int main()
{
    int n{0};

    myLambda(n)(n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的程序在编译时输出"n:0".在这里我们有未指定的排序:它可以很容易地输出"n:1"发生了不同的评估顺序.

我的问题是:

  1. 在上面的最终函数调用(即lambda表达式调用)中,后缀表达式myLambda(0),其参数n和后续函数调用本身之间的排序关系究竟是什么?

  2. 以上是未定义或未指定行为的示例- 以及为什么(参考标准)?

  3. 如果我将lambda代码更改为[](int param) { std::cout << "hello" << std::endl }(即使结果独立于其参数,因此任何评估顺序决策,使行为确定性),上述2)的答案是否仍然相同?

编辑:我已将lambda参数名称从'n'更改为'param',因为这似乎导致了混淆.

c++ operator-precedence undefined-behavior language-lawyer c++14

24
推荐指数
2
解决办法
846
查看次数

我将用++ + i ++在C++ 17中评估什么?

看起来我们正在为C++获得全新的"面试问题"(我希望不是,实际上).

众所周知,在C++ 17之前,它是未定义的行为,但它是否会从C++ 17开始明确定义

由于目前似乎没有一个编译器实现了这个C++ 17修改,根据表达式评估规则,任何人都可以解释x在下面的代码中的值是什么?

int i = 0;
int x = i++ + i++;
Run Code Online (Sandbox Code Playgroud)

阿利斯代尔梅雷迪思提到这个例子在这里他CppCon 2016的谈话,但它并不完全清楚,我的最终值什么x会(虽然它似乎什么他要说的是,这将是至少1).

显然,i在这种情况下,本身将在表达式结尾处为2.

c++ operator-precedence undefined-behavior language-lawyer c++17

24
推荐指数
1
解决办法
878
查看次数

关于C++运算符"地址"和"范围解析"优先级的问题

您好我有这个代码与编译器错误(错误来自Microsoft Visual Studio 2008):

class B
{
protected:
int b;
};

class A : public B
{
public:
void foo(){ &B::b; }//  error C2248: 'B::b' : cannot access protected member declared in class 'B'
};
Run Code Online (Sandbox Code Playgroud)

虽然此代码没有错误:

class B
{
protected:
int b;
};

class A : public B
{
public:
void foo(){ &(B::b); }
};
Run Code Online (Sandbox Code Playgroud)

基于我对运算符优先级的了解,这两个片段在我看来是等价的,因为::具有比&更高的优先级(例如参见"联合攻击战斗机车辆C++编码系统开发和编码标准"第137页的表2)演示计划" http://www2.research.att.com/~bs/JSF-AV-rules.pdf)

但它们是不同的...我认为它与"指向数据成员"有关,但我不知道它如何与运算符优先级相符.

任何解释?

谢谢,亚历山德罗

c++ operator-precedence pointer-to-member

23
推荐指数
3
解决办法
507
查看次数

XSL模板优先级

我有2个模板

<template match="vehicle_details[preceding-sibling::vehicle_type = '4x4']/*">
    ...
</xsl:template>
<xsl:template match="vehicle_details[descendant::color = 'red']/*" >
    ...
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

我的问题是:哪个模板优先于转换.有人可以给我一个关于XSL模板优先级的概述/资源吗?

提前致谢!

xslt operator-precedence

23
推荐指数
1
解决办法
1万
查看次数

反引号运算符的固定性?

反引号运算符的固定性是什么?

例如,来自Real World Haskell的代码:

ghci> (1+) `fmap` [1,2,3] ++ [4,5,6]
[2,3,4,4,5,6]
Run Code Online (Sandbox Code Playgroud)

很明显,反引号操作符`fmap`具有更高的固定性++,但GHCi没有给出.

haskell operator-precedence operator-keyword

22
推荐指数
1
解决办法
1701
查看次数

showsPrec和运算符优先级

我之前问过这个问题,但似乎我的问题太过狭隘.那么让我们看看我是否可以解释我实际上在追求什么.

假设我有一些类型支持几个二元运算符,每个运算符具有不同的优先级和关联性.如何编写Show正确包含子表达式的实例?

我知道我在这里很密集,但每次尝试这样做都会出错.必须有一些机械程序,你可以遵循正确的工作,但我找不到它.有人可以告诉我一个例子吗?

我知道这最终归结为包装所有东西showParen,并使用showsPrec正确的幻数显示子表达式,我可以使它几乎工作,但它在所有情况下无法正常工作.


编辑:请考虑以下代码

data Expr =
  Const Int |
  Expr :+: Expr |
  Expr :-: Expr |
  Expr :*: Expr |
  Expr :/: Expr

infixl 6 :+:
infixl 6 :-:
infixl 7 :*:
infixl 7 :/:

instance Show Expr where
  showsPrec p e0 =
    case e0 of
     Const n -> shows n
     x :+: y -> showParen (p > 6) $ …
Run Code Online (Sandbox Code Playgroud)

string haskell operator-precedence

22
推荐指数
2
解决办法
1662
查看次数

使用双精度时,为什么不(x /(y*z))与(x/y/z)相同?

这部分是学术性的,就我的目的而言,我只需将它四舍五入到小数点后两位; 但是我很想知道结果会产生两个稍微不同的结果.

这是我写的测试,以缩小到最简单的实现:

@Test
public void shouldEqual() {
  double expected = 450.00d / (7d * 60);  // 1.0714285714285714
  double actual = 450.00d / 7d / 60;      // 1.0714285714285716

  assertThat(actual).isEqualTo(expected);
}
Run Code Online (Sandbox Code Playgroud)

但它失败了这个输出:

org.junit.ComparisonFailure: 
Expected :1.0714285714285714
Actual   :1.0714285714285716
Run Code Online (Sandbox Code Playgroud)

任何人都可以详细解释引擎盖下发生的事情导致1.000000000000000的价值X不同吗?

我在答案中寻找的一些要点是:精度丢失在哪里?首选哪种方法,为什么?哪个是正确的?(在纯数学中,两者都不对.也许两者都错了?)这些算术运算有更好的解决方案或方法吗?

java double rounding operator-precedence double-precision

22
推荐指数
2
解决办法
1705
查看次数