有谁知道D版本1.0的运营商优先级列表在哪里?
答案 0 :(得分:6)
在页面http://www.digitalmars.com/d/1.0/expression.html中,显示较高的内容通常具有较低的优先级。要获得特定的优先级,请遵循解析器规则。
15. typeof() typeid() is()
assert() import() mixin()
function delegate
T.x x!y
variables
(...) [...] //(Primary expressions)
"x" "y" //(Concatenation between string literals)
14. . x++ x--
x() x[] //(Postfix operators)
13. & ++x --x *
+x -x ! ~ (T).
new delete
cast //(Prefix operators)
12½. ^^ //(Power. D2 only)
12. * / % ///(Multiplicative operators)
11. + - ~ //(Additive operators)
10. >> << >>> //(Bitwise shift)
9. == != is !is
> < >= <=
!> !< !>= !<=
<> !<> <>= !<>=
in !in //(Comparison operators)
8. & //(Bitwise AND)
7. ^ //(Bitwise XOR)
6. | //(Bitwise OR)
5. && //(Logical AND)
4. || //(Logical OR)
3. ?: //(Conditional operator)
2. op= //(Assignment operator)
1⅔. => //(Lambda. D2 only. Not really an operator)
1⅓. .. //(Slicing. Not really an operator)
1. , //(Comma operator)
答案 1 :(得分:2)
评估顺序
以下二进制表达式是 严格按照从左到右的方式进行评估 顺序:
CommaExpression,OrOrExpression, AndAndExpression
以下二进制表达式是 在实现定义中进行评估 顺序:
AssignExpression,OrExpression, XorExpression,AndExpression, CmpExpression,ShiftExpression, AddExpression,CatExpression, MulExpression,函数参数
依赖于顺序是错误的 未指定时的评估。 例如,以下是 非法:
i = i++; c = a + (a = b); func(++i, ++i);
如果编译器可以确定 表达的结果是非法的 取决于评估顺序, 它可以发出错误(但不是 被要求)。检测能力 这些错误是一种品质 实施问题。
至少,这是Walter(D创作者)在this mailing list thread中提到的链接。
答案 2 :(得分:1)
据我所知,目前还没有一个很好的D运算符优先级表。你可以查看表达式(http://www.digitalmars.com/d/1.0/expression.html)上的页面,并根据语法分解你拥有的任何表达式并弄清楚它,但显然这不像桌子那么好或简单。
但是,C和C ++代码保证是具有相同行为的有效D代码,或者它不会编译。因此,只要您拥有的表达式是有效的C或C ++,您就可以使用C / C ++运算符优先级表:http://www.cppreference.com/wiki/operator_precedence
所以,虽然目前还没有一个很好的D运算符优先级表,但只要你理解C / C ++运算符优先级,真的不应该有任何意外。
编辑:对于特定于D的运营商,查看表达式页面,您已经
与其他赋值运算符相同的优先级
=
可能与==
的优先级相同与&lt;
相同的优先顺序与&gt;&gt;
相同的优先顺序&GT;
可能与*
的优先级相同我相信这是新D运营商的完整列表。我在其中几个案例中说“可能”,因为它看起来像Mark Rushakoff的答案所引用的实现定义(在这种情况下,如果不相同,优先级非常接近给定的运算符)。但是,我不确定它实际上是否重要,因为以一种非常模糊的方式混合其中一些是非常困难的(特别是是和 in )。
一般来说,如果你坚持C / C ++优先规则,你应该没问题。如果有的话,由于更严格的转换规则等,D将比C / C ++更具限制性,所以我认为你最终不会有任何额外的含糊之处。尽管如此,建议将明确的运算符优先级表添加到D文档中可能是个好主意。
答案 3 :(得分:0)
谷歌没有找到太多,猜测D是一种小众语言
但是,我确实偶然发现了thread关于从C ++转换为D的评论,其中D的创建者说“转换是我保持运算符优先级相同的一个原因。” 因此,如果您能找到C ++运算符优先级,那么您应该可以将它用于D
答案 4 :(得分:0)
只要有可能,D使用C运算符优先级。