标签: operator-keyword

iPad上的javascript unsigned shift操作符出了什么问题?

我不小心碰到了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浏览器.奇怪吧?

javascript unsigned shift ipad operator-keyword

10
推荐指数
1
解决办法
251
查看次数

是否可以在没有%%的情况下定义运算符?

在R中允许用户定义的运算符,但似乎只% %接受类似运算符.是否有可能绕过这个限制来定义运算符,例如>>,或者不喜欢的东西% %

操作员必须是真正的操作员,以便我们可以像1 >> 2使用它一样使用它">>"(1,2).

r operator-keyword

10
推荐指数
2
解决办法
605
查看次数

简化常用方法的调用

我有一个这样的课:

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)

那么有什么方法可以避免引号?或者以何种方式简化调用?

methods perl6 operator-keyword

10
推荐指数
2
解决办法
112
查看次数

9
推荐指数
1
解决办法
1689
查看次数

谁在+运算符中删除了复制的实例?(C++)

我搜索了如何在互联网上正确实现+运算符,我找到的所有结果都执行以下步骤:

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)

关于这个"过程"我几乎没有问题:

  1. 以这种方式实现+运算符不是那么愚蠢,它在第一行调用赋值运算符(复制类),然后在返回中调用复制构造函数(由于返回的事实,它也复制了类)按价值,所以它破坏了第一个副本并创建了一个新的......坦白说,这并不是很聪明......)

  2. 当我写a = b + c时,b + c部分创建该类的新副本,然后'a ='部分将副本复制给自己.谁删除了b + c创建的副本?

  3. 有没有更好的方法来实现+运算符而不需要两次处理类,也没有任何内存问题?

提前致谢

c++ memory copy variable-assignment operator-keyword

9
推荐指数
2
解决办法
284
查看次数

是否可以在Java中创建自定义运算符?

类似于是否可以在c#中创建一个新的运算符?,是否可以为Java创建自己的运算符?我最初会说不,因为你不能重载,但是再一次,String支持+和+ =(在执行时隐式地通过StringBuilder等).

java operator-keyword

9
推荐指数
2
解决办法
1万
查看次数

如何使用按位运算符计算机记录基数2?

我需要在C中计算数字的日志基数2,但我不能使用数学库.答案不需要精确,只需要最接近的int.我已经考虑过了,我知道我可以使用while循环并继续将数字除以2,直到它<2,并保持迭代次数,但这是否可以使用按位运算符?

c bit-manipulation logarithm operator-keyword

9
推荐指数
2
解决办法
2万
查看次数

奇怪的Java行为.三元运算符

为什么这段代码有效?

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的三元运算符改变了行为.谁能解释为什么会这样,拜托?

java ternary operator-keyword

9
推荐指数
1
解决办法
816
查看次数

当一个对象同时提供`operator!`和`operator bool`时,它在表达式`!obj`中使用?

我遇到了一个我无法自己回答的问题.此外,我没有在谷歌和这里找到答案.比如,我想在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子句中实际使用了哪一个重载运算符?无论哪种方式,结果显然都是一样的.

c++ overloading operator-keyword

9
推荐指数
1
解决办法
131
查看次数

哈克将javascript编号转换为UInt32

编辑:此问题已过期,因为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位浮点值?或者有人能指出黑客入手的地方?

javascript bit-manipulation indexof uint32 operator-keyword

9
推荐指数
1
解决办法
7394
查看次数