我不小心碰到了iPad上Safari的javascript引擎中一个非常奇怪的错误.
无符号移位运算符>>>应该按位右移数字.我在脚本中遇到了一些错误,这些错误在其他平台上运行良好,将其剥离并最终得到:
<html><head><script type='text/javascript'>
var one = 1;
function Zero()
{
return one*0;
}
function Strange()
{
return one = (Zero()+1) >>> 0;
}
var s = 'A bunch of ones: '; // except on iPad :(
for (var i=0; i<200; i++)
{
s += Strange()+' ';
}
document.write(s);
</script></head><body></body></html>
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它正确地生成了一堆,但在某个时刻,某些东西会中断并且从那时起它只会输出零.
显然>>> 0在这里毫无意义(零位置的移位通常什么都不做,尽管如果javascript做出这种区分,它可能会强制整数变为无符号).这只是为了证明这个问题,如果你省略了>>> 0它没有显示出来.在我的实际情况中,有不同的数字和更复杂的表达涉及,但同样的事情发生:一切都工作,直到一些迭代,然后一些'休息'和变量突然变成并保持为零,即使在后续计算真正应该做他们非零.
适用于Android和PC浏览器.奇怪吧?
在R中允许用户定义的运算符,但似乎只% %接受类似运算符.是否有可能绕过这个限制来定义运算符,例如>>,或者不喜欢的东西% %?
操作员必须是真正的操作员,以便我们可以像1 >> 2使用它一样使用它">>"(1,2).
我有一个这样的课:
class Foo {
method some-method(Str $name) { ... }
}
Run Code Online (Sandbox Code Playgroud)
用法简单:
my $foo = Foo.new;
$foo.some-method("peter");
Run Code Online (Sandbox Code Playgroud)
由于"some-method"将被频繁调用,我想做一些事情以允许用户使用它,如下所示:
$foo.peter;
Run Code Online (Sandbox Code Playgroud)
我知道FALLBACK会完成这项工作,但它已被用于另一种方法.我试图定义一个中缀运算符:
sub infix:<%>(Foo $foo, $name) {
$foo.some-method($name);
}
Run Code Online (Sandbox Code Playgroud)
下面的代码有效,但双引号很烦人.
$foo % "peter";
Run Code Online (Sandbox Code Playgroud)
那么有什么方法可以避免引号?或者以何种方式简化调用?
在IsVB.NET关键字一样Object.ReferenceEquals?
我搜索了如何在互联网上正确实现+运算符,我找到的所有结果都执行以下步骤:
const MyClass MyClass::operator+(const MyClass &other) const
{
MyClass result = *this; // Make a copy of myself. Same as MyClass result(*this);
result += other; // Use += to add other to the copy.
return result; // All done!
}
Run Code Online (Sandbox Code Playgroud)
关于这个"过程"我几乎没有问题:
以这种方式实现+运算符不是那么愚蠢,它在第一行调用赋值运算符(复制类),然后在返回中调用复制构造函数(由于返回的事实,它也复制了类)按价值,所以它破坏了第一个副本并创建了一个新的......坦白说,这并不是很聪明......)
当我写a = b + c时,b + c部分创建该类的新副本,然后'a ='部分将副本复制给自己.谁删除了b + c创建的副本?
有没有更好的方法来实现+运算符而不需要两次处理类,也没有任何内存问题?
提前致谢
类似于是否可以在c#中创建一个新的运算符?,是否可以为Java创建自己的运算符?我最初会说不,因为你不能重载,但是再一次,String支持+和+ =(在执行时隐式地通过StringBuilder等).
我需要在C中计算数字的日志基数2,但我不能使用数学库.答案不需要精确,只需要最接近的int.我已经考虑过了,我知道我可以使用while循环并继续将数字除以2,直到它<2,并保持迭代次数,但这是否可以使用按位运算符?
为什么这段代码有效?
Float testFloat = null;
Float f = true ? null : 0f;
Run Code Online (Sandbox Code Playgroud)
为什么会抛出异常呢?
Float testFloat = null;
Float f = true ? testFloat : 0f;
Run Code Online (Sandbox Code Playgroud)
但最奇怪的是,此代码也成功运行,没有任何例外:
Float testFloat = null;
Float f = testFloat;
Run Code Online (Sandbox Code Playgroud)
似乎Java的三元运算符改变了行为.谁能解释为什么会这样,拜托?
我遇到了一个我无法自己回答的问题.此外,我没有在谷歌和这里找到答案.比如,我想在if子句中"检查对象的有效性",如下所示:
MyClass myObject;
// [some code, if any]
if (!myObject)
{
// [do something]
}
Run Code Online (Sandbox Code Playgroud)
我们MyClass这样定义:
class MyClass
{
public:
MyClass() { };
virtual ~MyClass() { };
bool operator!()
{
return !myBool;
};
operator bool()
{
return myBool;
};
private:
bool myBool = 0;
};
Run Code Online (Sandbox Code Playgroud)
我现在的问题是:在这个if子句中实际使用了哪一个重载运算符?无论哪种方式,结果显然都是一样的.
编辑:此问题已过期,因为Polyfill示例已更新.我在这里留下这个问题仅供参考.阅读关于按位移位运算符的有用信息的正确答案.
题:
在Mozilla Array.prototype.indexOf页面的Polyfill示例中的第7行,他们对此进行评论:
var length = this.length >>> 0; // Hack to convert object.length to a UInt32
Run Code Online (Sandbox Code Playgroud)
但Mozilla上的按位移位规范明确指出运算符返回与左操作数相同类型的值:
移位运算符将其操作数转换为32位整数,并返回与左操作数相同类型的结果.
所以不应该长度接收标准的64位浮点值?或者有人能指出黑客入手的地方?