问题标签 [ambiguity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python 中数值的陷阱,“多深?”
我是一个相当绿色的程序员,我现在正在学习 Python。我已经读到“Learn to Think Like a Computer Scientist”(类和方法)的第 17 章,我刚刚写了我的第一个 doctest,但以一种我真的不完全理解的方式失败了:
第二个 doctest__init__
失败,并返回 4.7000000000000002 而不是 4.7。但是,如果我用“打印”语句重写 doctest,如下所示:
它运行正确。
所以我阅读了 Python 如何存储浮点数,现在我明白了,由于十进制数的二进制表示,差异的原因是 Python 将 4.7 存储为 1 和 0 的字符串,几乎但不完全等于 4.7 .
但我不明白为什么对“point.x”的调用返回 4.7000000000000002 而对“print point.x”的调用返回 4.7。在其他什么情况下,Python 会像使用“print”一样选择舍入?这个四舍五入是如何工作的?这些尾随的重要数字是否会导致编程错误(显然,除了失败的文档测试)?不注意舍入会产生危险的歧义吗?
由于这与十进制数的二进制表示有关,我确信这实际上是一个一般的 CS 问题,而不是特定于 Python 的问题,但我现在真正需要知道的是我能做什么,特别是作为一个Python 程序员,以避免任何相关问题和/或错误侵扰。
此外,对于奖励积分,除了由“a = 4.7”之类的行激活的默认值之外,Python 是否还有其他方式可以存储浮点数?我知道有 Decimal 包,但我不完全确定它是如何工作的。老实说,所有这些动态类型的东西有时会让我感到困惑。
编辑: 我应该指定我使用的是 Python 2.6(有时我想使用 NumPy 和 Biopython)
c++ - 预期的行为是什么?
下面是一个纯学术发明的类层次结构。
我希望使用 X::f2 的声明是模棱两可的,因为“X”是“D”的模棱两可的基础(X 的可见性与可访问性)。但是 g++ (ideone.com) 编译得很好。
我检查了 Online Comeau,它在按预期使用 X::f2 声明时出错。但是,它也为使用 Z::X::f3 的声明提供了歧义。
那么预期的行为是什么?
编辑1:
请参考标准的适当部分。
编辑2:
我检查了 VS 2010,它只对使用声明 X::f2 有异议。然而,这与“X”的歧义无关(如 gcc 和 Comeau 的情况)。它是关于“错误 C2876:'X':并非所有重载都可以访问”。
编辑3:
在这里,我尝试(有目的地)在 using 声明中创建类型问题。Gcc 仍然可以很好地编译,VS2010 也是如此。Comeau 仍然给出关于模棱两可类型“麻烦”的错误(如预期的那样)。根据对初始查询的解释,看来 GCC 和 VS2010 是错误的。那是对的吗?
c# - 等效隐式运算符:为什么它们是合法的?
更新!
请参阅下面我对 C# 规范的一部分的剖析;我想我一定遗漏了一些东西,因为在我看来,我在这个问题中描述的行为实际上违反了规范。
更新2!
好的,经过进一步思考,并根据一些评论,我想我现在明白发生了什么。规范中的“源类型”一词指的是转换自的类型——即,Type2
在我下面的示例中——这仅仅意味着编译器能够将候选者缩小到定义的两个运算符(因为Type2
源类型是对彼此而言)。但是,它不能进一步缩小选择范围。所以规范中的关键词(因为它适用于这个问题)是“源类型”,我之前误解(我认为)它的意思是“声明类型”。
原始问题
假设我定义了这些类型:
然后说我这样做:
显然这是模棱两可的,因为不清楚implicit
应该使用哪个运算符。我的问题是——因为我看不到任何解决这种歧义的方法(它不像我可以执行一些显式转换来澄清我想要的版本),但是上面的类定义确实编译——为什么编译器允许那些匹配的implicit
运算符?
解剖
好的,我将通过 Hans Passant 引用的 C# 规范的摘录来尝试理解这一点。
找到将考虑用户定义的转换运算符的类型集 D。该集合由 S(如果 S 是类或结构)、S 的基类(如果 S 是类)和 T(如果 T 是类或结构)组成。
我们正在从 Type2
( S )转换为 Type1
( T )。因此,这里的D似乎包括示例中的所有三种类型:(Type0
因为它是S的基类)、Type1
(T)和Type2
(S)。
找到一组适用的用户定义的转换运算符 U。该集合由 D 中的类或结构声明的用户定义的隐式转换运算符组成,它们从包含 S 的类型转换为由 T 包含的类型。如果 U 为空, 转换未定义并发生编译时错误。
好的,我们有两个满足这些条件的运算符。in 声明的版本Type1
符合要求,因为Type1
它在D中,并且它从Type2
(显然包含S)转换为Type1
(显然包含在T中)。出于完全相同的原因,in 中的版本Type2
也符合要求。所以U包括这两个运算符。
最后,关于在U中查找运算符的最具体的“源类型” SX:
如果 U 中的任何运算符从 S 转换,则 SX 是 S。
现在,U中的两个运算符都从S转换- 所以这告诉我SX是S。
这不是意味着Type2
应该使用该版本吗?
可是等等!我很困惑!
难道我不能只定义Type1
' 运算符的版本,在这种情况下,唯一剩下的候选者将是Type1
' 版本,但根据规范SX将是Type2
?这似乎是一种可能的情况,其中规范要求一些不可能的事情(即,Type2
应该使用中声明的转换,而实际上它不存在)。
ambiguity - 是否可以在 D 中一般实现 amb 运算符?
是否可以在 D 中一般实现 amb 运算符?
http://www.haskell.org/haskellwiki/Amb
http://www.randomhacks.net/articles/2005/10/11/amb-operator
我正在考虑的事情是:
在最后两个示例中,确实需要将 ~ 和 .length “提升”到 amb “上下文”(单子?)。在前两个示例中,运算符应仅应用于 amb 的内容。
我已经做了一个简短的尝试,但是在尝试解除包装类型的运算符/方法/属性(本示例中的 *、~ 和 .length)时遇到问题。这应该如何在 D 中完成?
谢谢,
克里斯。
c++ - 模棱两可的语法
为什么右大括号之前的主函数中的最后两行会出错?为什么在不同的上下文中对表达式 MYINT() 的处理方式不同?任何标准参考都会有所帮助。
c++ - 匿名命名空间歧义
考虑以下代码段:
在这种情况下,如何引用匿名命名空间内的内容?
grammar - spotting an Ambiguous BNF
I have an assignment to correct an ambiguous BNF, but I am completely lost. I know this not a true programming question, and I will gladly delete it if it is not an appropriate question for these boards. Are there any good sites where I could learn more about BNF's? The one I am dealing with seems rather simple, but I can't find any examples or good explanations regarding BNF's. I have had some experience spotting ambiguous parse trees and other sorts of grammars, but I am completely lost on this one.
Since it is a school assignment, I am not sure I should post the BNF in question, but if anyone knows of a good site that I could look over to perhaps gain a better understanding of how to attack my question. I really just don't know where to start.
antlr - 这个语法有什么问题?(ANTLRWorks 1.4)
我有以下用 ANTLRWorks 1.4 编写的代码
当我使用输入运行它时:
我得到一个 MismatchedTokenException(5 != 15)。
并输入:
我得到一个 NoViableAltException。
虽然它运行良好
我是新手,但似乎有歧义?或者我对 ANTLR 的使用不正确?
c++ - 浮点数和整数歧义
我有一个函数(和一个构造函数)应该能够接受整数和浮点值。事实上,我希望它采用 aint64_t
或 a long double
,所以我想要的是,
但是,如果我这样做并尝试Foo f = 1;
编译器会抱怨从模棱两可的int
转换Foo
。好的,但是如果我将第一个构造函数更改为采用 aint32_t
就没有这种歧义。谁能向我解释为什么会这样。
ajax - 在同一个 SharePoint Web 应用程序中使用两个版本的 Ajax(1.0.61025 和 3.5.0.0)
我正在开发一个 SharePoint Web 应用程序。因为我可以将 Web 部件添加到 SharePoint 页面,所以我添加了两个 Web 部件 A 和 B,其中 A 使用 Ajax 扩展 1.0,B 使用它的 3.5 版本。
如果我在 Web 应用程序中启用 Ajax,我会得到两个版本的 dll System.Web.Extensions(1.0.61025.0 和 3.5.0.0)的 web.config 条目,因此我得到一个模棱两可的错误。
如何使应用程序同时使用这两个版本?我不能使版本统一,因为我可以从不同的供应商那里购买 Web 部件。
什么是解决方案?Ajax 扩展的两个版本如何共存?