2011-10-19 31 views
6

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

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支持++这让我们想到为什么。

是否有逻辑(没有双关语意)之所以语言支持所有其他主要运营商的分配形式,但不是& & = ||或=

我有反对的论据一个模糊的记忆这些,但谷歌和SO搜索很难当你的搜索词'& & =',因此我什么也没找到。

+1

今天我有_exactly_这个想法,因为在lua中,'&&'是单词'和',所以我想知道他们是如何做&& =',并且意识到在lua或in中没有'&& ='大多数语言。 –

回答

1

&&||是特殊的,因为它们在大多数语言中是唯一提供短路评估的结构,因此它们与正常的非短路操作符当涉及到缩写形式。避免短路或不短路的混淆的最简单方法不是首先将其包括在内。

-1

你什么时候真的需要这个?一般来说,当你做布尔操作时,你不会更新值,而是为一次性操作计算一些东西。你的例子不是很现实;有很多情况下你真的会这样做。

另外,在所有语言中,我可以想到增强赋值只存在于位运算和算术运算中,而非布尔运算。

+2

当左手边不是布尔值时,它非常方便,但具有*真实性*。 –

2

Perl支持这个。这是非常方便的,能够这样写:

$x ||= $defaultX; 
+1

我认为Perl支持每个运营商和世界上其他所有产品的每种可能的组合? –

+1

@Uwe:是的,它[是](http://www.ozonehouse.com/mark/periodic/) – hugomg

1

第一个原因是,该语言允许你达到使用“冗长”的形式你的目标。之后,对于每个不寻常的案例都增加了操作员,这让人不悦。部分原因是,语言设计者必须明智地决定运营商优先权。这并不像看起来那么简单 - 以C为例,它在&,|,&&||上搞砸了直观的优先级。

第二个原因是,大多数现代语言都支持某种形式的例外。通过使用带有额外奖励的例外,可以轻松地重写您的案例,从而可以更轻松地将有关故障的信息传递给主叫方。

因此,像这样的特殊运算符的需求是非常小的。

哦,我差点错过了最重要的原因:C没有他们。这是什么意思最好描述在A Brief, Incomplete, and Mostly Wrong History of Programming Languages

1970年 - 尼克劳斯沃斯创建Pascal,一种程序语言。批评者 立即谴责帕斯卡,因为它使用“x:= x + y”语法 而不是更熟悉的C-like“x = x + y”。尽管C还没有被发明,但这种批评仍在发生。

1972年 - 丹尼斯里奇发明了一个强大的枪,同时发射 和同时向后。不满意死亡人数 和他发明C和Unix的发明的永久禁锢。

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

+0

我仍然不明白为什么在这个标题中有一个“大部分错误”。 :P – hugomg

+0

downvote(r)的任何评论? –

0

不像+ =和朋友,& & =没有映射到单个硬件指令。这是一种测试或清晰的方式。