我喜欢Scala提出的运算符优先级,但在极少数情况下,未经修改的规则可能不方便,因为在命名方法时有限制.有没有办法为Scala中的类/文件等定义另一个规则?如果没有,将来会解决吗?
我已经在这里回答了许多问题.但究竟是什么意思呢?
var test = new Dictionary<int, string>();
test.Add(0, "zero");
test.Add(1, "one");
test.Add(2, "two");
test.Add(3, "three");
Assert(test.ElementAt(2).Value == "two");
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎按预期工作.那么字典被认为是无序的?在什么情况下上面的代码会失败?
我正在攻读OCPJP考试,因此我必须了解Java的每一个奇怪的细节.这包括增量前和增量后运算符应用于变量的顺序.以下代码给出了奇怪的结果:
int a = 3;
a = (a++) * (a++);
System.out.println(a); // 12
Run Code Online (Sandbox Code Playgroud)
答案不应该是11吗?或者13?但不是12!
跟进:
以下代码的结果是什么?
int a = 3;
a += (a++) * (a++);
System.out.println(a);
Run Code Online (Sandbox Code Playgroud) 术语"运算符优先级"和"评估顺序"是编程中非常常用的术语,对于程序员来说非常重要.而且,据我所知,这两个概念紧密相连; 在谈论表达时,一个人离不开另一个人.
我们举一个简单的例子:
int a=1; // Line 1
a = a++ + ++a; // Line 2
printf("%d",a); // Line 3
Run Code Online (Sandbox Code Playgroud)
现在,很明显会Line 2导致未定义的行为,因为C和C++中的序列点包括:
在评估&&(逻辑AND)的左右操作数之间,|| (逻辑OR)和逗号运算符.例如,在表达式中
*p++ != 0 && *q++ != 0,子表达式的所有副作用*p++ != 0都在任何访问尝试之前完成q.在评估三元"问号"运算符的第一个操作数和第二个或第三个操作数之间.例如,在表达式中,在第
a = (*p++) ? (*p++) : 0一个之后存在一个序列点*p++,这意味着它已经在第二个实例执行时增加了.在完整表达结束时.此类别包括表达式语句(例如赋值
a=b;),return语句,if,switch,while或do-while语句的控制表达式,以及for语句中的所有三个表达式.在函数调用中输入函数之前.未指定参数的计算顺序,但此序列点表示在输入函数之前所有副作用都已完成.在表达式中
f(i++) + g(j++) + h(k++),f使用原始值的参数调用i,但i在进入正文之前递增f.同样,j和k正在进入前更新g和h分别.然而,不指定以何种顺序f() …
我有一个行代码,
int a = 10;
a = ++a * ( ++a + 5);
Run Code Online (Sandbox Code Playgroud)
我的预期产量是12 * (11 + 5) = 192,但我得到187.我知道内部的增量运算符()首先要解决,然后为什么首先解决外部的增量运算符?
我程序中的Perl代码片段给出了错误的结果.
$condition ? $a = 2 : $a = 3 ;
print $a;
Run Code Online (Sandbox Code Playgroud)
无论价值$condition是什么,输出总是3,怎么样?
我正在尝试为自己验证Haskell中的运算符和函数优先级.例如,以下代码
list = map foo $ xs
Run Code Online (Sandbox Code Playgroud)
可以改写为
list = (map foo) $ (xs)
Run Code Online (Sandbox Code Playgroud)
并最终将成为
list = map foo xs
Run Code Online (Sandbox Code Playgroud)
我的问题曾经是,为什么第一个表述不会被重写为
list = (map foo $) xs
Run Code Online (Sandbox Code Playgroud)
因为函数优先级总是高于运算符优先级,但我认为我找到了答案:运算符根本不允许作为函数的参数(当然,除非用括号括起它们).这是正确的吗?如果是这样的话,我觉得很奇怪,在RWH中没有提到这个机制/规则或者学习一个Haskell,或者我搜索过的任何其他地方.因此,如果您知道规则所在的地方,请链接到该地址.
- 编辑:感谢您的快速解答.我认为我的困惑来自于认为运算符字母会以某种方式评估某些东西,这可能会被函数作为参数使用.它帮助我记住,一个中缀运算符可以机械地转换为前缀函数.对第一个配方这样做会产生
($) (map foo) (xs)
Run Code Online (Sandbox Code Playgroud)
毫无疑问,($)是消耗函数,并且由于两个公式是等价的,因此第一个公式中的$ literal不能被map使用.
在C编程语言中,为什么按位运算符(&和|)的优先级低于等于运算符(==)?这对我来说没有意义.
我有以下代码,我写的是为了测试更大程序的一部分:
#include <fstream>
#include <random>
#include <iostream>
using namespace std ;
int main()
{
mt19937_64 Generator(12187) ;
mt19937_64 Generator2(12187) ;
uniform_int_distribution<int> D1(1,6) ;
cout << D1(Generator) << " " ;
cout << D1(Generator) << " " << D1(Generator) << endl ;
cout << D1(Generator2) << " " << D1(Generator2) << " " << D1(Generator2) << endl ;
ofstream g1("g1.dat") ;
g1 << Generator ;
g1.close() ;
ofstream g2("g2.dat") ;
g2 << Generator2 ;
g2.close() ;
}
Run Code Online (Sandbox Code Playgroud)
这两个生成器的种子具有相同的值,因此我预计输出中的第二行与第一行相同.相反,输出是
1 1 3 …Run Code Online (Sandbox Code Playgroud) a = [1, 2, 3]
a[-1] += a.pop()
Run Code Online (Sandbox Code Playgroud)
这导致了[1, 6].
a = [1, 2, 3]
a[0] += a.pop()
Run Code Online (Sandbox Code Playgroud)
这导致了[4, 2].什么评估顺序给出了这两个结果?