我们f x y = x * y.我们可以通过两种方式应用此函数:f 5 6或者,使用中缀表示法5 `f` 6.运算符规则是否适用于最后一个表达式?这个应用程序有什么优先权?它只是另一种形式的功能应用程序,它也具有最高优先级吗?
我想编译器会看到这种特殊形式(由于``和/或名称以字母(?)开头),并且实际上将其视为普通函数应用程序,而不是将其视为运算符.
haskell function operators infix-notation operator-precedence
根据这个问题的答案,以下代码是合法的:
#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++.这是(假设的)行为差异的来源吗?
这是一个(非常基本的)语言律师问题.我理解代码的作用以及原因,所以请不要用基本的解释.
在表达式中,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语句语法的一部分.不过,我不确定如何/在哪里指定非表达式优先级.
提前道歉,我知道评估订单的一般主题已经有很多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"发生了不同的评估顺序.
我的问题是:
在上面的最终函数调用(即lambda表达式调用)中,后缀表达式myLambda(0),其参数n和后续函数调用本身之间的排序关系究竟是什么?
以上是未定义或未指定行为的示例- 以及为什么(参考标准)?
如果我将lambda代码更改为[](int param) { std::cout << "hello" << std::endl }(即使结果独立于其参数,因此任何评估顺序决策,使行为确定性),上述2)的答案是否仍然相同?
编辑:我已将lambda参数名称从'n'更改为'param',因为这似乎导致了混淆.
c++ operator-precedence undefined-behavior language-lawyer c++14
看起来我们正在为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
您好我有这个代码与编译器错误(错误来自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)
但它们是不同的...我认为它与"指向数据成员"有关,但我不知道它如何与运算符优先级相符.
任何解释?
谢谢,亚历山德罗
我有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模板优先级的概述/资源吗?
提前致谢!
反引号运算符的固定性是什么?
例如,来自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没有给出.
我之前问过这个问题,但似乎我的问题太过狭隘.那么让我们看看我是否可以解释我实际上在追求什么.
假设我有一些类型支持几个二元运算符,每个运算符具有不同的优先级和关联性.如何编写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) 这部分是学术性的,就我的目的而言,我只需将它四舍五入到小数点后两位; 但是我很想知道结果会产生两个稍微不同的结果.
这是我写的测试,以缩小到最简单的实现:
@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不同吗?
我在答案中寻找的一些要点是:精度丢失在哪里?首选哪种方法,为什么?哪个是正确的?(在纯数学中,两者都不对.也许两者都错了?)这些算术运算有更好的解决方案或方法吗?