现代语言支持+ =但不是&& =

时间:2011-10-19 21:04:27

标签: operators language-design shortcut

大多数(但我实际上只知道一小部分,所以不要在这一点上挑剔)高级语言支持多个不同的赋值运算符。

a += 5;  // increment a and assign result beack to a.

但是没有(我看过(再次是一个小数字))似乎支持&& =运算符。
我问我最近看到的原因是:

// simplified.
bool x = false;


x = x && testA(); // perform test A/B/C/D stop on first failure.
x = x && testB();
x = x && testC();
x = x && testD();

我想知道为什么我们不能使用:

x &&= testA(); // perform test A/B/C/D stop on first failure.
x &&= testB();
x &&= testC();
x &&= testD();

原因是C / C ++不支持&& =,这让我们想到了原因。

是否存在逻辑(没有双关语)的原因,为什么语言支持所有其他主要运算符的分配形式但不支持&& =或|| =

我对这些争论有一个模糊的回忆,但当你的搜索字词是'&& ='时谷歌搜索和搜索搜索很难,结果我找不到任何东西。

5 个答案:

答案 0 :(得分:2)

Perl支持这一点。能够写下来非常方便:

$x ||= $defaultX;

答案 1 :(得分:1)

第一个原因是语言允许您使用“详细”表单达到目标。在此之后,为每个不寻常的情况添加运算符是不满意的。部分原因是语言设计者必须明智地决定运算符优先级。这并不像它看起来那么容易 - 以C为例,它在&|&&||上混淆了直观的优先顺序。

第二个原因是,大多数现代语言都支持某种形式的例外。通过使用带有额外奖励的例外情况,可以轻松地重写您的案例,可以更轻松地将有关失败的信息传递给调用者。

因此,对此类特殊操作员的需求非常小。

哦,我几乎错过了最重要的原因:C没有它们。这意味着最好在A Brief, Incomplete, and Mostly Wrong History of Programming Languages中描述:

  

1970年 - Niklaus Wirth创造了Pascal,一种程序语言。批评者   立即谴责Pascal,因为它使用“x:= x + y”语法   而不是更熟悉的类C“x = x + y”。这种批评   尽管C还没有被发明,但仍然会发生。

     

1972年 - 丹尼斯·里奇发明了一种能够向前射击的强力枪   并且同时向后。不满意死亡人数   他发明了C和Unix,并发明了永久性的消息。

这只是表明C仍然是一个你无法逃脱的吸引力。

答案 2 :(得分:1)

&&||是特殊的,因为在大多数语言中,它们是提供短路评估的唯一结构,因此它们与正常情况区别对待是有意义的,非短路,操作员说到缩写形式。避免&&=短路混淆的最简单方法是首先不包括它。

答案 3 :(得分:0)

与+ =和朋友不同,&& =不会映射到单个硬件指令。这是一种测试或清除。

答案 4 :(得分:-1)

你什么时候真的需要这个?通常,当您执行布尔操作时,您不是更新值,而是为一次性操作计算某些内容。你的榜样不太现实;你真的没有多少情况。

此外,在我能想到的所有语言中,增强赋值仅存在于按位和算术运算中,而不是布尔运算。