大多数(但我实际上只知道一小部分,所以不要在这一点上挑剔)高级语言支持多个不同的赋值运算符。
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 ++不支持&& =,这让我们想到了原因。
是否存在逻辑(没有双关语)的原因,为什么语言支持所有其他主要运算符的分配形式但不支持&& =或|| =
我对这些争论有一个模糊的回忆,但当你的搜索字词是'&& ='时谷歌搜索和搜索搜索很难,结果我找不到任何东西。
答案 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)
你什么时候真的需要这个?通常,当您执行布尔操作时,您不是更新值,而是为一次性操作计算某些内容。你的榜样不太现实;你真的没有多少情况。
此外,在我能想到的所有语言中,增强赋值仅存在于按位和算术运算中,而不是布尔运算。